停止线程
/*
*
* 停止线程
* 线程的停止:
1. 停止一个线程 我们一般都会通过一个变量去控制的。线程的停止,并不是直接杀死线程,而是让线程中的任务执行完毕
2. 如果需要停止一个处于等待状态下的线程,那么我们需要通过变量配合notify方法或者interrupt()来使用。
*
* */
class Demo extends Thread{
boolean flag=true;
public Demo(String name){
super(name);
}
public synchronized void run(){
int i=0;
while(flag){
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
//e.printStackTrace();
System.out.println("接收到了异常");
}
System.out.println(Thread.currentThread().getName()+":"+i);
i++;
}
}
}
public class Thread_08 {
public static void main(String[] args){
Demo d=new Demo("线程1");
d.setPriority(10);//这是设置线程的优先级 ,线程的优先级是1-10
d.start();//开启线程
for(int i =0; i<100;i++){
System.out.println(Thread.currentThread().getName()+":"+i);
if(i==90){//当i=90的时候停止线程
//d.interrupt(); // interrupt()根本就是无法停止一个线程。
d.flag=false;
//d.interrupt();//把线程的等待状态强制清楚,被清除状态的线程会接收到一个InterruptedException
synchronized (d) {
d.notify();
}
}
}
}
}
守护线程
/*
* 守护线程(后台线程):在一个进程中如果只剩下了 守护线程,那么守护线程也会死亡。(就是主线程结束后,守护线程没有完成任务也会死亡)
* 一个线程默认的都不是守护线程
* */
class Demo10 extends Thread{
public Demo10(String name){
super(name);
}
public void run(){
for (int i = 0; i <1000; i++) {
System.out.println(this.getName()+":"+i);
}
}
}
public class Thread_09 {
public static void main(String[] args) {
Demo10 d=new Demo10("后台线程");
d.setDaemon(true);//设置线程是否为守护线程,true为守护线程,false为非守护线程
//System.out.println(d.isDaemon());;isDaemon()查看线程是否为守护线程
d.start();
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName());
}
}
}
join方法
/*
* 线程的join方法
* 一个线程如果执行join语句,那么就有新的线程加入,执行该语句的线程必须要让步给新加入的线程先完成任务,然后才能继续执行。
*join(millis); 等待millis 毫秒终止线程,假如这段时间内该线程还没执行完,那么结束等待,2个线程并发执行
* */
class Mom extends Thread{
public Mom(String name){
super(name);
}
public void run(){
System.out.println("妈妈洗菜");
System.out.println("妈妈切菜");
System.out.println("妈妈准备炒菜,发现没有酱油了。。");
//叫儿子去打酱油
Son s=new Son();
s.start();
try {
s.join();//加入。 一个线程如果执行join语句,那么就有新的线程加入,执行该语句的线程必须要让步给新加入的线程先完成任务,然后才能继续执行。
//s.join(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("妈妈继续炒菜");
System.out.println("一起吃饭");
}
}
class Son extends Thread{
@Override
public void run() {
System.out.println("儿子下楼");
try {
this.sleep(1000);//睡眠1000毫秒
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("儿子一直往前走");
System.out.println("儿子打完酱油了");
System.out.println("上楼,把酱油给给妈妈");
}
}
public class Thread_10 {
public static void main(String[] args) {
Mom mom=new Mom("妈妈");
mom.start();
}
}
网友评论