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方法改