這段時間看的部分感覺沒啥需要記錄下來的,個人也沒什麼想法,不過以後還是要多記,多寫
package cn.xf.cp.ch02.item66; import java.util.concurrent.TimeUnit; import org.junit.Test; public class StopThread { /** * 停止線程變量 */ private static boolean stopRequested; //吧對變量的讀和寫方法都進行同步 private static synchronized void requestStop() { stopRequested = true; } private static synchronized boolean stopRequested() { return stopRequested; } /** * 停止線程變量,這個使用關鍵字volatile使每個線程都是獲取到最新的值 */ private static volatile boolean stopRequested2; @Test public void test() { Thread backgroundThread = new Thread(new Runnable() { @Override public void run() { int i = 0; while(!stopRequested()) { ++i; } } }); //啟動線程 backgroundThread.start(); //休眠1秒 try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } requestStop(); } @Test public void test2() { Thread backgroundThread = new Thread(new Runnable() { @Override public void run() { int i = 0; System.out.println("這裡使用最新的stopRequested2值"); while(!stopRequested2) { ++i; } } }); //啟動線程 backgroundThread.start(); //停下1s之後執行變量修改程序 try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } //修改變量 stopRequested2 = true; } public static void main(String[] args) throws InterruptedException { Thread backgroundThread = new Thread(new Runnable() { @Override public void run() { int i = 0; System.out.println(stopRequested); //false //這裡停不下來是因為主線程對stopRequest進行修改的時候,這個線程並不可見 while(!stopRequested) { ++i; } } }); //啟動線程 backgroundThread.start(); //休眠1秒 TimeUnit.SECONDS.sleep(1); stopRequested = true; } }
這個main方法是永遠不停的,其余兩個從兩個不同的角度給出了同步的方法
總之:當多個線程共享可變數據的時候,每個讀或者寫數據的線程都必須執行同步。