线程的概念
(1)什么是线程?
(2)线程是轻量级的进程
(3)线程没有独立的地址空间
(4)线程是由进程创建的(寄生在进程中)
(5)一个进程可以有多个线程
(6)线程有多个状态:新建状态、就绪状态、运行状态、阻塞状态和死亡状态。
线程的状态转换图
线程的使用
在java中一个类要当做线程来使用有两种方法:
(1) 继承Thread类并重写run方法
(2) 实现Runnable接口,重写run方法
为什么要设计第二种方法实现Runnable方法实现线程?
因为java是单继承的,在某些情况下一个类可能已经继承了某个父类,这是再用继承Thread方法来创建线程显示是不可能的,java设计者们于是就设计了第二种实现Runable接口来创建线程
通过继承Thread来创建线程,案例代码:
/*
* 演示如何通过继承Thread来创建线程*/
package com.fox.test1;
public class Demo10_1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Cat cat1 = new Cat();
//启动线程,会导致run函数的运行
cat1.start();
}
}
class Cat extends Thread{
int times=0;
@Override
public void run() {
// TODO Auto-generated method stub
while(true)
{
try {
Thread.sleep(1000);//休眠1000ms
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
times++;
System.out.println("Thread:helloworld!"+" 第"+times+"次打印");
if(times ==10)
break;
}
}
}
通过实现Runnable接口来创建线程,案例代码:
package com.fox.test2;
/*
* 演示使用实现Runnable接口的方式来创建线程*/
public class Demo10_2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Cat cat1 = new Cat();
Thread thread= new Thread(cat1);
thread.start();//启动线程的方式与继承Thread不同,先创建一个此线程对象,传入cat1的实例 ,然后调用线程的start函数
}
}
class Cat implements Runnable{
int times =0;
@Override
public void run() {
// TODO Auto-generated method stub
while(true)
{
try {
Thread.sleep(1000);//休眠1000ms
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
times++;
System.out.println("Thread:helloworld!"+" 第"+times+"次打印");
if(times ==10)
break;
}
}
}
多线程案例
多线程编写按钮,编写一个程序,该程序可以接收一个整数n,创建线程,一个线程计算从1+2+3..+n的结果,一个线程在控制台输出“我是一个线程,我正在输出第xx个helloworld“,xx要用具体的数字显示,这两个工作要同时进行。
/*
* 演示两个线程同时运行*/
package com.fox.test3;
public class Demo10_3 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Pig pig = new Pig(10);
Bird brid = new Bird(10);
Thread t1= new Thread(pig);
Thread t2= new Thread(brid);
t1.start();
t2.start();
}
}
//算数学题
class Bird implements Runnable{
int n;
int sum;
int times =0;
public Bird(int n) {
this.n =n;
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
sum+=(++times);
System.out.println("当前的结果是"+sum);
if(times == n)
{
System.out.println("最后的结果是"+sum);
break;
}
}
}
}
class Pig implements Runnable{
int n;
int times =0;
public Pig(int n) {
this.n = n;
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true)
{
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
times++;
System.out.println("我是一个线程,正在输出第"+times+"个helloworld");
if(times == n)
break;
}
}
}
运行结果:
我是一个线程,正在输出第1个helloworld
我是一个线程,正在输出第2个helloworld
当前的结果是1
我是一个线程,正在输出第3个helloworld
我是一个线程,正在输出第4个helloworld
当前的结果是3
我是一个线程,正在输出第5个helloworld
当前的结果是6
我是一个线程,正在输出第6个helloworld
我是一个线程,正在输出第7个helloworld
我是一个线程,正在输出第8个helloworld
当前的结果是10
我是一个线程,正在输出第9个helloworld
当前的结果是15
我是一个线程,正在输出第10个helloworld
当前的结果是21
当前的结果是28
当前的结果是36
当前的结果是45
当前的结果是55
最后的结果是55