1. 程式人生 > >Java 多執行緒 學習筆記(二)停止執行緒的幾種方法

Java 多執行緒 學習筆記(二)停止執行緒的幾種方法

1.異常法:

package test;

import exthread.MyThread;

import exthread.MyThread;

public class Run {

	public static void main(String[] args) {
		try {
			MyThread thread = new MyThread();
			thread.start();
			Thread.sleep(2000);
			thread.interrupt();
		} catch (InterruptedException e) {
			System.out.println("main catch");
			e.printStackTrace();
		}
		System.out.println("end!");
	}

}

package exthread;


public class MyThread extends Thread {
<span style="white-space:pre">	</span>@Override
<span style="white-space:pre">	</span>public void run() {
<span style="white-space:pre">		</span>super.run();
<span style="white-space:pre">		</span>for (int i = 0; i < 500000; i++) {
<span style="white-space:pre">			</span>if (this.interrupted()) {
<span style="white-space:pre">				</span>System.out.println("已經是停止狀態了!我要退出了!");
<span style="white-space:pre">				</span>break;
<span style="white-space:pre">			</span>}
<span style="white-space:pre">			</span>System.out.println("i=" + (i + 1));
<span style="white-space:pre">		</span>}
<span style="white-space:pre">		</span>System.out.println("我被輸出,如果此程式碼是for又繼續執行,執行緒並未停止!");
<span style="white-space:pre">	</span>}
}

執行結果:

......

i=255229
i=255230
i=255231
i=255232
i=255233
i=255234
i=255235
i=255236
i=255237
i=255238
i=255239
i=255240
i=255241
i=255242
i=255243
i=255244
i=255245
i=255246
i=255247
i=255248
i=255249
i=255250
i=255251
i=255252
i=255253
i=255254
i=255255
i=255256
i=255257
i=255258
i=255259
i=255260
i=255261
i=255262
i=255263
i=255264
i=255265
i=255266
已經是停止狀態了!我要退出了!
end!
我被輸出,如果此程式碼是for又繼續執行,執行緒並未停止!
已經是停止狀態了!我要退出了!    雖然停止,但是for迴圈以後的程式碼還是會執行的

正確的退出方式

package exthread;

public class MyThread extends Thread {
	@Override
	public void run() {
		super.run();
		try {
			for (int i = 0; i < 500000; i++) {
				if (this.interrupted()) {
					System.out.println("已經是停止狀態了!我要退出了!");
					throw new InterruptedException();
				}
				System.out.println("i=" + (i + 1));
			}
			System.out.println("我在for下面");
		} catch (InterruptedException e) {
			System.out.println("進MyThread.java類run方法中的catch了!");
			e.printStackTrace();
		}
	}
}

2.在沉睡中停止
package exthread;

public class MyThread extends Thread {
	@Override
	public void run() {
		super.run();
		try {
			System.out.println("run begin");
			Thread.sleep(200000);
			System.out.println("run end");
		} catch (InterruptedException e) {
			System.out.println("在沉睡中被停止!進入catch!"+this.isInterrupted());
			e.printStackTrace();
		}
	}
}

package test;

import exthread.MyThread;

import exthread.MyThread;

public class Run {

	public static void main(String[] args) {
		try {
			MyThread thread = new MyThread();
			thread.start();
			Thread.sleep(200);
			thread.interrupt();
		} catch (InterruptedException e) {
			System.out.println("main catch");
			e.printStackTrace();
		}
		System.out.println("end!");
	}

}
執行結果:

run begin
end!
在沉睡中被停止!進入catch!false
java.lang.InterruptedException: sleep interrupted
at java.lang.Thread.sleep(Native Method)
at exthread.MyThread.run(MyThread.java:9)

另外一種情況是先停止後sleep 

3.暴力停止: 

Thread.stop() 這種方法存在非執行緒安全問題。所以暫時不考慮

4.使用return 停止執行緒

package test.run;

import extthread.MyThread;

public class Run {

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

}

package extthread;

public class MyThread extends Thread {

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

}


相關推薦

Java 執行 學習筆記停止執行方法

1.異常法: package test; import exthread.MyThread; import exthread.MyThread; public class Run { pu

執行學習筆記執行安全問題

執行緒安全問題的現象 首先讓我們考慮一個問題: class Demo implements Runnable{ private int num = 100; //實現Runnable介面,覆蓋run方法 public void r

Java線程學習synchronized

參考 .get name syn his col 靜態方法 runtest 作用範圍 synchronized 有二種修飾方法: 修飾一個方法 synchronized public void runTest{ /**/ } 修飾一個代碼塊 publi

《自己動手寫java虛擬機器》學習筆記-----命令列工具java

專案地址:https://github.com/gongxianshengjiadexiaohuihui 首先是Cmd的類 /** * @ClassName Cmd * @Description TODO * @Author Mr.G * @Date 2018/10/9 9:40

java學習筆記執行

1、執行緒的生命週期:新建(New)、就緒(Runnable)、執行(Running)、阻塞(Blocked)、死亡(Dead)。 2、啟動執行緒呼叫的是start()方法而不是run()方法。如果直接呼叫run()方法,則run()方法會立即執行,而且在run()方法返回之前其他執行緒無法併發執行,也就是說

Java執行學習筆記

1、原子性:操作不能被打斷,要麼成功要麼失敗。i++ 不是原子操作。 2、可見性:一個執行緒修改了資料,其他執行緒立刻可見。 3、順序性: 4、volatile 保證程式的可見性,和順序性。不能保證對複合操作(如i++)的原子性。 javap -v xxx.class

Java執行學習筆記之中斷中的Interrupt,interrupted(),isInterrupted()

1、關於中斷 在Java中中斷最初是通過stop()來終止執行緒的,後來發現這樣簡單粗暴的停止執行緒會產生很多問題(例如物件monitor的釋放),所以改為deprecated,推薦使用interrupt()來中斷執行緒。而對於執行緒來說,會持有一個inter

java執行學習筆記高階

1.程序和程序之間的記憶體是獨立的。 2.多程序的程式是為了提高CPU的使用率。 3.多執行緒不是為了提高執行速度,而是為了提高應用程式的使用率。 4.執行緒和執行緒共享“堆記憶體和方法區記憶體”,棧記憶體是獨立的也就是說一個執行緒一個棧。 5.關於java程式的執行原理:

Java 執行學習筆記synchronized 鎖重入

關鍵字synchronized 擁有鎖重入的功能,也就是使用synchronized時,當一個執行緒得到一個物件鎖後,再次請求此物件鎖時是可以再次得到該物件的鎖的。這也就證明在一個synchroniz

nodejs學習筆記——javascript的同步非同步行為和執行

寫過後臺的同學一定對執行緒、執行緒池或者是多執行緒這些概念不會陌生,但是前臺在HTML5之前很少會提及,因為在HTML5之前javascript都是單執行緒的。下面用一個簡單的例子來說明一下單執行緒: setInterval(function(){ var date

Java 執行學習筆記資料型別String的常量池特性

將synchronized(String)與String 混合使用時需要注意String的常量池特性帶來的影響 package extthread; import service.Service;

執行學習總結

一、多執行緒帶來的問題 (一)活躍性問題 死鎖:兩個執行緒相互等待對方釋放資源 飢餓: 多執行緒併發時優先順序低的執行緒永遠得不到執行;執行緒被永久阻塞在一個等待進入同步塊的狀態;等待的執行緒永遠不被喚醒 活鎖:活鎖指的是任務或者執行者沒有被阻塞,由於某些條件沒有滿足,導致

《自己動手寫java虛擬機器》學習筆記-----執行私有執行時資料區go

     專案地址:https://github.com/gongxianshengjiadexiaohuihui      在執行java程式時,Java虛擬機器需要使用記憶體來存放各種各樣的資料,Java虛擬機器規範把這些記憶體的區

執行學習筆記

一. 新建執行緒(兩種方法) 第一種:繼承Thread 1.定義一個類繼承Thread 2.該類重寫run方法。其中的getName是獲取執行緒名方法;有參構造可以在新建時指定執行緒名 3.建立子類物件就是建立新執行緒 4.子類物件呼叫start方法 ,開啟執行

java執行:4、Java執行的支援後臺執行setDaemon、暫停執行yield

文章目錄 一、設定後臺執行緒 二、yield方法,暫停執行緒讓別的執行緒執行 上篇文章介紹了執行緒實現方式、執行緒的隨機性,大家如需瞭解可參考 java多執行緒:3、Java對多執行緒的支援(一)執行緒實現方式、執行緒的隨機性 這篇我們來看看後臺執行緒setD

Java高併發程式設計學習筆記Java記憶體模型和執行安全

文章目錄 原子性 有序性 可見性 – 編譯器優化 – 硬體優化(如寫吸收,批操作) Java虛擬機器層面的可見性 Happen-Before規則(先行發生) 程式順序原則: volat

執行學習筆記之單例模式中的執行問題

在某些情況下,每個類只需要一個例項,單例模式就是保證在整個應用程式的生命週期中,任何一個時刻,單例類的例項都只存在一個(當然也可以不存在),核心點: 將採用單例模式的類的構造方法私有化(private修飾) 在其內部產生該類的例項化物件,並將其封裝成priv

執行學習筆記1

1.執行緒的建立 兩種方式:繼承Thread類,實現Runnable介面 繼承Thread類:重寫run方法 實現Runnable介面:實現run方法,同時需在宣告時飲用Thread類構造方法來成為真正的執行緒物件。 實現Runnable介面的好處是:若所定義的類已經是其他

java學習筆記圖形用戶接口

star strong per getwidth cep runnable graphics s2d gb2 這個學期主要放在ACM比賽上去了,比賽結束了。不知不覺就15周了,這周就要java考試了,復習一下java吧。java的學習的目的還是讓我們學以致用,讓我們可以

Java學習筆記-------String,StringBuffer,StringBuilder區別以及映射到的同步,異步相關知識

ringbuf 等待 java學習筆記 java學習 單線程 回復 改變 hashtable ble 1. String是不可變類,改變String變量中的值,相當於開辟了新的空間存放新的string變量 2. StringBuffer 可變的類,可以通過append方法改