java 多线程(1) join() / interrupt() 打断sleep() / stop() / run() / 线程停止的方法

本文深入探讨Java线程的生命周期管理,包括如何使用interrupt()、join()、run()等关键方法控制线程行为,避免使用过激的stop()方法,并通过示例代码展示线程的启动、暂停、停止及线程间同步的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java Thread 类方法

interrupt( ) 很粗暴,尽量不要用,interrupt( ) 打断sleep( ) ,程序如 1

stop( )  更粗暴,不要用,因为interrupt()起码还有个catch语句块,有个把我打开的资源关闭的机会,你stop是这个线程再也没机会执行了

run()方法一结束,线程就结束。

join() 方法,程序 2

线程停止,最好不要用thread.stop( ),用flag 来判断,对外提供shutdown( )方法,如程序3

程序1:

package test.java.Thread;

import java.util.Date;

public class TestInterrupt {

	public static void main(String[] args) {
		MyThread thread = new MyThread();
		thread.start();
		try {
			Thread.sleep(10000);//在哪个线程中,调用sleep,哪个线程睡
		}catch (InterruptedException e){}
		//thread.interrupt(); //谁调用谁被打断。叫做你睡着的时候,我把你打断。10秒过后,主线程不高兴了,一盆凉水泼过去,子线程的sleep函数
							//抛InterruptedException 异常
		thread.flag = false;  //这样就让子线程停止了,记住,轻易不要给人泼凉水(interrupt()),因为你在catch语句块中把自己的业务写进去
								//也是一种不好的编程方式。但是可以用,至少比stop() 强.stop()太粗暴了,轻易不要用。
		//thread.stop();	//记住也不要调用Thread 的 stop()方法去让子线程停止,因为stop比interrupt 还粗暴。前者是泼一盆凉水,
							//stop是一根棒子打脑袋上,立刻死掉。因为interrupt()起码还有个catch语句块,有个把我打开的资源关闭的机会,你stop是这个线程再也没机会执行了,
	}

}
class MyThread extends Thread{ //
	boolean flag = true;  //
	public void run(){//不能在这throws InterruptedException 因为这里run()是重写的方法,重写的方法不能抛出与被重写方法不同的异常
		while (flag) { //所以这里写throws 不行,只能写try catch 
			System.out.println("==="+new Date()+"===");
			try {
				sleep(1000);
			} catch (InterruptedException e) {
				return; //return 则线程结束。所以主线程一执行 thread.interrupt(),则子线程结束。但是这只是演示interrupt方法,以上不是
						//让子线程结束最好的方法。因为你这个interrupt方式太粗暴了,你catch 了一个exception,万一人家打开一个资源,没来得及关,怎么办
						//如果这种子线程while(true)的,想让子线程停止,怎么办?如程序,直接定义一个flag 变量等于true,你想让他停止,
						//直接在main 线程中thread.flag 等于false 就可以。这样run()方法就结束了,run()方法一结束,线程就结束。这是一个简单的控制办法
			}
		}
	}
}

join( ) 方法,程序2:

public class TestJoin {

	public static void main(String[] args) throws UnsupportedEncodingException {
		MyThread2 t1 = new MyThread2("zi xiancheng");
		t1.start();
		try{
			t1.join(); //把t1 线程和当前线程合并,则这个相当于方法调用了,t1的run()就执行了,执行之后再执行这句后面的语句
		}catch(InterruptedException e){
			System.out.println("我是main,被interrupt");
		}
		for(int i=0;i<1000;i++)
			System.out.println("I am main thread");
	}
	
}

class MyThread2 extends Thread {
	MyThread2(String s ){// 这个参数是线程名字,没什么用,可以作为一个标识,由本线程的getName()方法去调用
		super(s);
	}
	
	public void run(){
		for(int i=0;i<10;i++){
			System.out.println("I am "+getName());
			try{
				sleep(1000);
			}catch(InterruptedException e){
				return ;
			}
		}
	}
}

程序3:

package test.java.Thread;

import java.util.Date;

public class TestInterrupt {

	public static void main(String[] args) throws InterruptedException {
		MyThread thread = new MyThread();
		thread.start();
		for(int i=0;i<100;i++){
			System.out.println("main thread"+i);
		}
		thread.shutDown();
		Thread.sleep(10000);
		System.out.println(thread.getState());//TERMINATED,run 方法一结束,线程就结束
	}

}
class MyThread extends Thread{
	boolean flag = true;  //
	public void run(){ 
		int i=0;
		while (flag==true) {  
			System.out.println(" "+i++);
		}
	}
	
	public void shutDown(){
		flag = false;
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值