关于Java线程终止、暂停、联合的文章网上有很多,经过测试,本节重点讲解的是针对不同使用场景选择合适的方法。
终止线程的典型方式
终止线程我们一般不使用JDK提供的stop()/destroy()方法(他们本身也被JDK废弃了)。通常的做法是提供一个boolean型的终止变量,当这个变量置为false,则终止线程的运行。
【示例1】终止线程的典型方法(重要!!!)
public class TestThreadCiycle implements Runnable {
String name;
boolean live = true;
public TestThreadCiycle(String name) {
super();
this.name = name;
}
public void run() {
int i=0;
while(live){
System.out.println(name+(i++));
}
}
public void terminate(){
live = false;
}
public static void main(String[] args) {
TestThreadCiycle ttc = new TestThreadCiycle("线程A:");
Thread t1 = new Thread(ttc); //新生状态
t1.start(); //就绪状态
for(int i=0;i<1000;i++){
System.out.println(i);
}
ttc.terminate();
System.out.println("ttc stop!");
}
}
暂停线程执行sleep/yield
sleep()可以让正在运行的线程进入阻塞状态,直到休眠时间满了,进入就绪状态。yield()可以让正在运行的线程直接进入就绪状态,让出CPU的使用权。
【示例2】暂停Threads的方法sleep、yield
public class TestThreadState {
public static void main(String[] args) {
//使用继承方式实现多线程
StateThread thread1 = new StateThread();
thread1.start();
StateThread thread2 = new StateThread();
thread2.start();
}
}
class StateThread extends Thread {
public void run(){
for(int i=0;i<100;i++){
System.out.println(this.getName()+":"+i);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//Thread.yield();
}
}
}
线程的联合join()
线程A在运行期间,可以调用线程B的join()方法,让线程B和线程A联合。这样,线程A就必须等待线程B执行完毕后,才能继续执行。
如下面示例中,“爸爸线程”要抽烟,于是联合了“儿子线程”去买烟,必须等待“儿子线程”买烟完毕,“爸爸线程”才能继续抽烟。
【示例3】测试线程的联合join()方法
public class TestThreadState {
public static void main(String[] args) {
System.out.println("爸爸和儿子买烟故事");
Thread father = new Thread(new FatherThread());
father.start();
}
}
class FatherThread implements Runnable {
public void run() {
System.out.println("爸爸想抽烟,发现烟抽完了");
System.out.println("爸爸让儿子去买包红塔山");
Thread son = new Thread(new SonThread());
son.start();
System.out.println("爸爸等儿子买烟回来");
try {
son.join();
} catch (InterruptedException e) {
e.printStackTrace();
System.out.println("爸爸出门去找儿子跑哪去了");
System.exit(1);//结束JVM。如果是0则表示正常结束;如果是非0则表示非正常结束
}
System.out.println("爸爸高兴的接过烟开始抽,并把零钱给了儿子");
}
}
class SonThread implements Runnable {
public void run() {
System.out.println("儿子出门去买烟");
System.out.println("儿子买烟需要10分钟");
try {
for (int i = 1; i <=10;i++) {
System.out.println("第" + i + "分钟");
Thread.sleep(1000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("儿子买烟回来了");
}
}
「全栈Java笔记」是一部能帮大家从零到一成长为全栈Java工程师系列笔记。笔者江湖人称 Mr. G,10年Java研发经验,曾在神州数码、航天院某所研发中心从事软件设计及研发工作,从小白逐渐做到工程师、高级工程师、架构师。精通Java平台软件开发,精通JAVAEE,熟悉各种流行开发框架。
笔记包含从浅入深的六大部分:
A-Java入门阶段
B-数据库从入门到精通
C-手刃移动前端和Web前端
D-J2EE从了解到实战
E-Java高级框架精解
F-Linux和Hadoop