2022年06月26我们讲到了创建线程的三种方式,同学们
下面是控制线程
目录
1. 加入线程 join()方法
假设我们有两个线程 A线程和 B线程
当创建并开启 线程A ,然后又在 线程A的任务中创建并开启了 线程B
然后调用了 线程B的join()方法
然后 A就不执行了,它要等 B执行完再继续执行
下面是一个例子:
我们要开一个会,有三个部门,要等三个部门的人都到齐了再开会
public class ManageThread extends Thread{
@Override
public void run() {
// 这个会议是主线程
System.out.println("准备开会,然后进入等待状态............");
try {
// 创建三个部门对象
Department1 d1=new Department1();
// 开启部门子线程
d1.start();
Department2 d2=new Department2();
d2.start();
Department3 d3=new Department3();
// 把三个部门子线程都加入进来
d3.start();
d1.join();
d2.join();
d3.join();
}catch (Exception e){
e.printStackTrace();
}
System.out.println("人员到齐,开会!!!");
}
public static void main(String[] args) {
new ManageThread().start();
}
}
public class Department1 extends Thread{
@Override
public void run() {
// 这个是子线程 部门1
try {
// 部门1需要等5秒人才能来齐
sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("部门1准备完成");
}
}
(部门2要等7秒,部门3要等3秒,小编在这里就不写了QωQ)
会议是主线程,三个部门是子线程,
加入后,要等三个子线程都执行结束,主线程才能执行
也就是说最后要等7秒
要是我们这样写:
Department1 d1=new Department1();
d1.start();
d1.join();
Department2 d2=new Department2();
d2.start();
d2.join();
Department3 d3=new Department3();
d3.start();
d3.join();
那等部门1 执行完, 才能执行部门2,
等部门2 执行完, 才能执行部门3
2. 后台线程 setDaemon(true)方法
后台线程在后台运行,为其他线程提供服务
当所有前台线程死亡后,后台进程就跟着死亡了
调用Thread对象的setDaemon()方法可以把一个线程变成后台线程
下面是一个示例:
public class Canteen implements Runnable {
@Override
public void run() {
// 这里写了一个死循环,每隔1秒钟就会发出通告:食堂正在营业
while (true){
System.out.println("食堂正在营业.........");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class Customer implements Runnable{
@Override
public void run() {
for (int i = 0; i <=5; i++) {
// 这个是顾客类,每隔2秒就会有人去餐厅吃饭,重复5次
System.out.println("有人去餐厅吃饭了.........");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class ThreadTest {
public static void main(String[] args) {
// 这是一个测试类
// 创建一个餐厅线程
Thread canteen=new Thread(new Canteen());
// 把餐厅设置为后台线程
canteen.setDaemon(true);
canteen.start();
// 创建并开启一个顾客线程
Thread customer=new Thread(new Customer());
customer.start();
}
}
这样等没人去吃饭,餐厅就关门了