多线程
2018-08-27 本文已影响0人
bfx1000
Reference:http://www.java1234.com
多线程实现的两种方式:
方法1、实现Runnable接口(推荐使用)
方法2、继承Thread类
实例:张三、李四一起吃包子,每人吃了十个(两人吃包子同时进行)
方法1、实现Runnable接口
分以下几个步骤:
- 重写run()方法
Thread t1 =new Thread( new runnable("张三"));
t1.start();
写测试文件TestRunnable.java
import java.lang.Thread;
class TestRunnable implements Runnable{
private int baozi=1;
private String threadName;
private TestRunnable(String threadName){
super();
this.threadName=threadName;
}
@Override
public void run(){
while(baozi<11){
System.out.println(threadName+"吃第"+baozi+"个包子");
baozi++;
}
}
public static void main (String[] args){
System.out.println("张三、李四一起吃包子,每人吃十个");
TestRunnable t11=new TestRunnable("张三");
Thread t1 =new Thread(t11);
t1.start();
TestRunnable t22=new TestRunnable("lisi");
Thread t2 =new Thread(t22);
t2.start();
}
}
方法2、继承Thread
import java.lang.Thread;
class TestThread2 extends Thread{
private int baozi =1;
private String threadName;
private TestThread2(String threadName){
super();
this.threadName=threadName;
}
@Override
public void run(){
while(baozi<11){
System.out.println(threadName+" eat baozi's number is "+baozi);
baozi++;
}
}
public static void main(String[] args) {
TestThread2 t1=new TestThread2("zhangsan");
t1.start();
TestThread2 t2=new TestThread2("lisi");
t2.start();
}
}
第二个实例:
超级张三开三个线程一起吃10个包子
class TestThread3 implements Runnable{
/**
* 超级张三吃10个包子,每次吃三个
*/
private int baozi =1;
private String threadName;
private TestThread3(String threadName){
super();
this.threadName=threadName;
}
// synchronized 作用是只能有一个线程进入该方法
@Override
public synchronized void run(){
while(baozi<11){
System.out.println(threadName+" eat baozi's number is "+baozi);
baozi++;
}
}
public static void main(String[] args) {
TestThread3 t1=new TestThread3("超级张三");
// 对t1开启三个线程,三个“超级张三”一起吃十个包子
// 每个线程一次吃一个包子
Thread t11=new Thread(t1);
Thread t12=new Thread(t1);
Thread t13=new Thread(t1);
t11.start();
t12.start();
t13.start();
}
}
结果图:
线程状态图:
状态 | 解释 |
---|---|
新建状态 | Thread t=new Thread()后,对象处于新建状态,但不可运行 |
就绪状态 | 新建对象后,调用start()方法可以启动线程 |
运行状态 | 线程启动后,自动调用重写的run()方法 |
堵塞状态 | 正在运行的某个线程在被人为挂起或者需要进行输入输出/操作时,让出cup并暂停自己的执行并进入阻塞状态。阻塞状态不能进入列队,当阻塞原因被消除后,线程可以转入就绪状态 |
死亡状态 | 调用stop()方法或者run()结束后,处于死亡状态 |