這段時間看的部分感覺沒啥需要記錄下來的,個人也沒什麼想法,不過以後還是要多記,多寫
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方法是永遠不停的,其餘兩個從兩個不同的角度給了同步的方法
總和:當多個執行緒共享可變資料的時候,每個讀取或寫入資料的執行緒都必須執行同步。