博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

多线程启动 停止线程

Posted on 2018-08-01 21:29  南国木棉  阅读(646)  评论(0编辑  收藏  举报

线程的概念:线程是进程独立运行的子任务。

多线程是异步的。所以,Java代码启动线程的顺序不是线程的执行顺序。

   通常实现线程有两种方式。

1 继承Thread类 

2 实现Runnable接口。

下面对这两种方法进行验证。

继承Thread类实现

public class MyThread extends Thread{

	@Override
	public void run() {
		super.run();
		System.out.println("my thread");
	}
}

 实现Runnable接口实现

public class MyThreadRun implements Runnable{

	@Override
	public void run() {
		System.out.println("my MyThreadRunnable");
	}
}

  主线程

public class Run {

	public static void main(String[] args) {
		
		//1 继承Thread类实现线程
		MyThread myThread=new MyThread();
		myThread.start();
		
		//2 实现runable接口
		MyThreadRun myThreadRun=new MyThreadRun();
		Thread thread=new Thread(myThreadRun);
		thread.start();

	}

}

  开启两个线程在控制台打印如下

my thread
my MyThreadRunnable  

  启动线程到此完毕,但是停止线程确没这么简单。停止线程在Java中并不像break语句那样干脆,在多线程开发的时候是很重要的技术点。

  停止一个线程意味着在线程处理完成任务之前停掉正在做的操作,也就是放弃当前操作。停止一个线程可以使用、Thread.stop()方法,但最好不要用,虽然它确实可以

停止一个线程,但这个方法是不安全的,而且是已经被启用作废的。

  Java中有下面三种方法可以终止正在运行的线程。

  1)使用退出标志,使线程正常 退出,也就是当run方法完成后线程终止。

  2)使用stop方法强行终止。但是不推荐使用。因为stop和suspend及resume方法一样,都是过期作废的方法,使用它们可能产生不可预料的后果。

  3)使用interrupt方法中断线程。但是要记住,调用interrupt只是给当前线程打上一个停止的标记,而并非是停止一个线程。需要和return配合使用。

  此处验证第三种方法。

public class MyThread extends Thread {

	@Override
	public void run() {
		super.run();
		while(true){
			if(this.isInterrupted()){
				System.out.println("停止了");
				return;
			}
			System.out.println(System.currentTimeMillis());
		}
	}
}

  

public class Run {

	public static void main(String[] args) throws InterruptedException {
		
		MyThread thread=new MyThread();
		thread.start();
		Thread.sleep(1000);
		thread.interrupt();
	}

}

  控制台输出

1533129685102
1533129685102
1533129685102
1533129685102
1533129685102
停止了

  可以发现,停止线程并不是一个break,而是利用interrupt方法给线程打上终止的标记,此时,isInterrupted()方法值为true,进入if,并return。

this.interrupted() :测试当前线程是否已经中断。

this.isInterrupted():测试线程是否已经中断。

 

 

 

  每一个优秀的人,都有一段沉默的时光。不抱怨,不诉苦,最后度过那段感动自己的日子。