1线程的停止:
1). 停止一个线程一般会通过变量去控制
2). 如果需要停止一个处于等待状态下的线程,需要通过变量配合notify方法或者interrupt方法
public class Demo2 extends Thread{
boolean flag = true;
public Demo2(String name){
super(name);
}
@Override
public void run() {
int i=0;
while(flag) {
try {
this.wait();
}catch(InterruptedException e) {
System.out.println("接受到了异常");
}
System.out.println(Thread.currentThread().getName()+":"+i);
i++;
}
}
public static void main(String[] args) {
Demo2 a= new Demo2("lisen");
a.start();
for(int i=0;i<100;i++) {
System.out.println(Thread.currentThread().getName()+":"+i);
//当主线程的i 是80的时候停止lisen线程
if(i==80) {
a.flag =false;
// a.interrupt(); //唤醒,把线程的等待状态强制清除,被清除状态的线程会收到一个中断异常
synchronized (a) {
a.notify();
}
}
}
}
}
2.守护线程(后台进程):在一个进程中如果只剩下了守护线程,那么守护线程也会死亡。
setDaemon(); //设置守护线程
isDaemon(); //判断是否为守护线程,true or false
package thread4;
//守护线程()
//守护线程(后台进程):在一个进程中如果只剩下了守护线程,那么守护线程也会死亡。
public class Demo3 extends Thread{
public Demo3(String name) {
super(name);
}
@Override
public void run() {
for(int i=0;i<=100;i++) {
System.out.println("更新包目前下載"+i+"%");
if(i==100) {
System.out.print("更新下載完畢,準備安裝");
}
}
}
public static void main(String[] args) {
Demo3 a = new Demo3("后台线程");
System.out.println("是否为守护线程"+a.isDaemon());//这时候不是守护线程
a.setDaemon(true);//设置线程为守护线程,true为守护线程,false为非守护线程
System.out.println("是否为守护线程"+a.isDaemon());//这时候是守护线程
a.start();
for(int i=0;i<=100;i++) {
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
}
3.join方法
package thread4;
//join方法
class Mom extends Thread{
public void run(){
System.out.println("安排儿子去打酱油");
Son b = new Son();
b.start();
try{
b.join();
}catch(InterruptedException e) {
e.printStackTrace();
}
System.out.println("用打来的酱油做好饭,吃饭!");
}
}
class Son extends Thread{
public void run() {
System.out.println("去打酱油去了");
System.out.println("打完酱油回家给老妈做菜");
}
}
public class Demo4 {
public static void main(String[] args) {
Mom a= new Mom();
a.start();
}
}