└── src ├── main └── java │ ├── ch09Future │ ├── q9_4 │ │ ├── Data.java │ │ ├── Main.java │ │ ├── FutureData.java │ │ ├── Host.java │ │ └── RealData.java │ ├── sample │ │ ├── Data.java │ │ ├── FutureData.java │ │ ├── Host.java │ │ ├── RealData.java │ │ └── Main.java │ ├── jucSample │ │ ├── Data.java │ │ ├── FutureData.java │ │ ├── RealData.java │ │ └── Main.java │ ├── q9_3 │ │ └── content │ │ │ ├── Content.java │ │ │ └── Retriever.java │ ├── a9_3a │ │ └── content │ │ │ ├── Content.java │ │ │ ├── Retriever.java │ │ │ └── AsyncContentImpl.java │ ├── a9_3b │ │ └── content │ │ │ ├── Content.java │ │ │ ├── Retriever.java │ │ │ └── AsyncContentImpl.java │ ├── a9_4a │ │ ├── Data.java │ │ ├── Main.java │ │ └── RealData.java │ └── a9_4b │ │ ├── Data.java │ │ ├── Main.java │ │ ├── FutureData.java │ │ └── RealData.java │ ├── ch12ActiveObject │ ├── a12_3b │ │ ├── searcher │ │ │ ├── Display.java │ │ │ ├── Searcher.java │ │ │ └── SearcherFactory.java │ │ └── Main.java │ ├── a12_2a │ │ ├── activeobject │ │ │ ├── Result.java │ │ │ ├── ActiveObject.java │ │ │ ├── RealResult.java │ │ │ ├── MethodRequest.java │ │ │ ├── DisplayStringRequest.java │ │ │ ├── ActiveObjectFactory.java │ │ │ ├── AddRequest.java │ │ │ ├── SchedulerThread.java │ │ │ ├── MakeStringRequest.java │ │ │ └── FutureResult.java │ │ └── Main.java │ ├── a12_3a │ │ ├── Main.java │ │ └── activeobject │ │ │ ├── Result.java │ │ │ ├── ActiveObject.java │ │ │ ├── RealResult.java │ │ │ ├── MethodRequest.java │ │ │ ├── ActiveObjectFactory.java │ │ │ ├── SearchRequest.java │ │ │ ├── SchedulerThread.java │ │ │ ├── Proxy.java │ │ │ ├── Servant.java │ │ │ └── FutureResult.java │ ├── sample │ │ ├── activeobject │ │ │ ├── Result.java │ │ │ ├── ActiveObject.java │ │ │ ├── RealResult.java │ │ │ ├── MethodRequest.java │ │ │ ├── DisplayStringRequest.java │ │ │ ├── ActiveObjectFactory.java │ │ │ ├── SchedulerThread.java │ │ │ ├── MakeStringRequest.java │ │ │ ├── FutureResult.java │ │ │ ├── Proxy.java │ │ │ └── Servant.java │ │ ├── Main.java │ │ └── DisplayClientThread.java │ ├── a12_2b │ │ ├── activeobject │ │ │ ├── ActiveObjectFactory.java │ │ │ └── ActiveObject.java │ │ └── Main.java │ ├── jucSample │ │ └── activeobject │ │ │ ├── ActiveObjectFactory.java │ │ │ └── ActiveObject.java │ ├── q12_2a │ │ └── Main.java │ └── q12_2b │ │ └── Main.java │ ├── ch07ThreadPerMessage │ ├── a7_5a │ │ ├── Main.java │ │ ├── Service.java │ │ └── MyFrame.java │ ├── a7_5b │ │ ├── Main.java │ │ ├── Service.java │ │ └── MyFrame.java │ ├── a7_5c │ │ ├── Main.java │ │ └── MyFrame.java │ ├── a7_5d │ │ ├── Main.java │ │ └── MyFrame.java │ ├── q7_5 │ │ ├── Main.java │ │ ├── Service.java │ │ └── MyFrame.java │ ├── a7_7a │ │ └── Main.java │ ├── a7_7b │ │ └── Main.java │ ├── q7_7 │ │ ├── Main.java │ │ └── Blackhole.java │ ├── q7_6 │ │ └── Main.java │ ├── a7_6a │ │ └── Main.java │ ├── a7_6b │ │ └── Main.java │ ├── a7_2 │ │ ├── Main.java │ │ ├── Host.java │ │ └── Helper.java │ ├── a7_3 │ │ ├── Main.java │ │ ├── Host.java │ │ └── Helper.java │ ├── a7_4a │ │ ├── Main.java │ │ ├── Host.java │ │ ├── HelperThread.java │ │ └── Helper.java │ ├── a7_4b │ │ └── Main.java │ ├── sample │ │ ├── Main.java │ │ ├── Host.java │ │ └── Helper.java │ ├── jucSample1 │ │ ├── Main.java │ │ ├── Host.java │ │ └── Helper.java │ ├── jucSample2 │ │ ├── Main.java │ │ ├── Host.java │ │ └── Helper.java │ ├── jucSample4 │ │ ├── Main.java │ │ ├── Helper.java │ │ └── Host.java │ ├── q7_3 │ │ └── Host.java │ ├── jucSample3 │ │ ├── Helper.java │ │ ├── Main.java │ │ └── Host.java │ ├── jucSample5 │ │ ├── Helper.java │ │ ├── Main.java │ │ └── Host.java │ ├── jucSample6 │ │ ├── Helper.java │ │ ├── Main.java │ │ └── Host.java │ └── jucSample7 │ │ ├── Helper.java │ │ └── Main.java │ ├── ch10TwoPhaseTermination │ ├── a10_5 │ │ ├── Main.java │ │ ├── ServiceThread.java │ │ └── Service.java │ ├── q10_5 │ │ ├── Main.java │ │ └── Service.java │ ├── a10_4 │ │ ├── CountupThread.java │ │ └── Main.java │ ├── a10_7 │ │ └── Main.java │ ├── q10_7 │ │ └── Main.java │ ├── a10_2 │ │ └── Main.java │ ├── a10_3 │ │ └── Main.java │ ├── q10_2 │ │ └── Main.java │ └── sample │ │ └── Main.java │ ├── ch01SingleThreadedExecution │ ├── a1_7c │ │ ├── Mutex.java │ │ ├── Main.java │ │ └── UserThread.java │ ├── a1_6a │ │ ├── Tool.java │ │ └── Main.java │ ├── a1_6b │ │ ├── Tool.java │ │ ├── Pair.java │ │ ├── Main.java │ │ └── EaterThread.java │ ├── q1_6 │ │ ├── Tool.java │ │ └── Main.java │ ├── q1_5 │ │ └── SecurityGate.java │ ├── q1_4 │ │ └── Point.java │ ├── a1_5 │ │ ├── CrackerThread.java │ │ └── SecurityGate.java │ ├── a1_7a │ │ ├── Main.java │ │ ├── Mutex.java │ │ └── UserThread.java │ ├── a1_7b │ │ ├── Main.java │ │ └── UserThread.java │ ├── sample2 │ │ ├── Main.java │ │ ├── UserThread.java │ │ └── Gate.java │ ├── a1_1 │ │ ├── UserThread.java │ │ └── Gate.java │ └── sample1 │ │ ├── UserThread.java │ │ └── Gate.java │ ├── ch04Balking │ ├── q4_4a │ │ ├── LivenessException.java │ │ └── RequestQueue.java │ ├── a4_4a │ │ ├── LivenessException.java │ │ ├── Request.java │ │ └── Main.java │ ├── a4_4b │ │ ├── LivenessException.java │ │ ├── Request.java │ │ └── Main.java │ ├── q4_5 │ │ ├── Main.java │ │ └── TestThread.java │ ├── a4_2b │ │ ├── Main.java │ │ └── SaverThread.java │ ├── init │ │ └── Something.java │ ├── sample │ │ ├── Main.java │ │ └── SaverThread.java │ ├── a4_2a │ │ ├── SaverThread.java │ │ └── Main.java │ ├── q4_4b │ │ └── RequestQueue.java │ └── timeout │ │ └── Main.java │ ├── com │ └── gmail │ │ └── mosoft521 │ │ └── App.java │ ├── ch00Introduction1 │ ├── qi1_3 │ │ ├── Main.java │ │ └── PrintThread.java │ ├── twoThreads │ │ ├── MyThread.java │ │ └── Main.java │ ├── singleThread │ │ └── Main.java │ ├── printThread │ │ ├── Main.java │ │ └── PrintThread.java │ ├── printer │ │ ├── Main.java │ │ └── Printer.java │ ├── sleep │ │ └── Main.java │ ├── jucThreadFactory │ │ ├── Printer.java │ │ └── Main.java │ ├── ai1_4 │ │ ├── ClientThread.java │ │ ├── Main.java │ │ └── Bank.java │ ├── qi1_6 │ │ └── Something.java │ ├── sync │ │ └── Bank.java │ └── qi1_4 │ │ └── Bank.java │ ├── ch02Immutable │ ├── q2_2 │ │ └── Main.java │ ├── sample │ │ ├── Main.java │ │ ├── PrintPersonThread.java │ │ └── Person.java │ ├── jucSample3 │ │ ├── Main.java │ │ ├── WriterThread.java │ │ └── ReaderThread.java │ ├── jucSample2 │ │ ├── Main.java │ │ ├── WriterThread.java │ │ └── ReaderThread.java │ ├── q2_5 │ │ └── Point.java │ ├── a2_5a │ │ ├── Point.java │ │ └── Main.java │ ├── a2_5b │ │ ├── Point.java │ │ └── Main.java │ ├── a2_4 │ │ ├── UserInfo.java │ │ └── Main.java │ ├── q2_4 │ │ └── UserInfo.java │ ├── jucSample1 │ │ ├── WriterThread.java │ │ ├── ReaderThread.java │ │ └── Main.java │ └── a2_2 │ │ └── Main.java │ ├── ch05ProducerConsumer │ ├── q5_2 │ │ ├── Main.java │ │ └── EaterThread.java │ ├── a5_9 │ │ ├── Main.java │ │ └── Something.java │ ├── q5_9 │ │ └── Something.java │ ├── jucSample2 │ │ └── Main.java │ ├── q5_7 │ │ └── Host.java │ ├── a5_5 │ │ ├── ClearThread.java │ │ ├── Main.java │ │ └── EaterThread.java │ ├── a5_4 │ │ ├── Main.java │ │ └── EaterThread.java │ ├── jucSample1 │ │ ├── Main.java │ │ ├── Table.java │ │ └── EaterThread.java │ ├── a5_8 │ │ ├── LazyThread.java │ │ └── EaterThread.java │ ├── sample │ │ └── EaterThread.java │ ├── a5_6 │ │ └── EaterThread.java │ └── a5_7 │ │ └── Host.java │ ├── ch11ThreadSpecificStorage │ ├── a11_3 │ │ ├── Main.java │ │ ├── ClientThread.java │ │ └── TSLog.java │ ├── q11_4 │ │ ├── Main.java │ │ ├── ClientThread.java │ │ ├── TSLog.java │ │ └── Log.java │ ├── sample2 │ │ ├── Main.java │ │ ├── ClientThread.java │ │ ├── TSLog.java │ │ └── Log.java │ ├── sample1 │ │ ├── Main.java │ │ └── Log.java │ ├── a11_6 │ │ ├── Main.java │ │ ├── TSLog.java │ │ └── Log.java │ └── q11_6 │ │ ├── TSLog.java │ │ └── Log.java │ ├── ch08WorkerThread │ ├── a8_5 │ │ └── Main.java │ ├── q8_5 │ │ └── Main.java │ ├── a8_2 │ │ ├── Main.java │ │ ├── Channel.java │ │ ├── ClientThread.java │ │ └── Request.java │ ├── sample │ │ ├── Main.java │ │ ├── WorkerThread.java │ │ ├── ClientThread.java │ │ └── Request.java │ ├── a8_3b │ │ ├── Channel.java │ │ ├── ClientThread.java │ │ ├── Request.java │ │ └── Main.java │ ├── a8_3a │ │ ├── WorkerThread.java │ │ ├── ClientThread.java │ │ ├── Request.java │ │ └── Main.java │ ├── jucSample │ │ ├── Main.java │ │ └── Request.java │ └── a8_6 │ │ ├── Main.java │ │ └── Request.java │ ├── ch03GuardedSuspension │ ├── a3_3 │ │ ├── Main.java │ │ └── Request.java │ ├── a3_5 │ │ ├── Request.java │ │ └── RequestQueue.java │ ├── a3_6 │ │ ├── Request.java │ │ └── RequestQueue.java │ ├── q3_5 │ │ ├── Request.java │ │ ├── Main.java │ │ └── RequestQueue.java │ ├── q3_6 │ │ ├── Request.java │ │ ├── RequestQueue.java │ │ └── ServerThread.java │ ├── sample │ │ ├── Request.java │ │ ├── RequestQueue.java │ │ └── Main.java │ └── jucSample │ │ ├── Request.java │ │ └── RequestQueue.java │ ├── ch99AppendixB │ ├── initializationOnDemandHolder │ │ ├── MySystem.java │ │ └── Main.java │ ├── singleThreadedExecution │ │ ├── MySystem.java │ │ └── Main.java │ ├── volatile2 │ │ └── Main.java │ ├── doubleCheckedLocking │ │ └── Main.java │ ├── volatile1 │ │ └── Main.java │ └── synchronized1 │ │ └── Main.java │ └── ch06ReadWriteLock │ ├── a6_2 │ ├── ReaderThread.java │ └── Main.java │ ├── q6_6 │ ├── ReaderThread.java │ └── Main.java │ ├── sample │ ├── ReaderThread.java │ └── Main.java │ ├── jucSample │ ├── ReaderThread.java │ └── Main.java │ ├── a6_3a │ ├── Main.java │ └── ReaderThread.java │ ├── a6_3b │ ├── Main.java │ └── ReaderThread.java │ ├── a6_4a │ └── RetrieveThread.java │ └── a6_4b │ └── RetrieveThread.java └── test └── java └── com └── gmail └── mosoft521 └── AppTest.java /src/main/java/ch09Future/q9_4/Data.java: -------------------------------------------------------------------------------- 1 | package ch09Future.q9_4; 2 | 3 | public interface Data { 4 | public abstract String getContent(); 5 | } 6 | -------------------------------------------------------------------------------- /src/main/java/ch09Future/sample/Data.java: -------------------------------------------------------------------------------- 1 | package ch09Future.sample; 2 | 3 | public interface Data { 4 | public abstract String getContent(); 5 | } 6 | -------------------------------------------------------------------------------- /src/main/java/ch09Future/jucSample/Data.java: -------------------------------------------------------------------------------- 1 | package ch09Future.jucSample; 2 | 3 | public interface Data { 4 | public abstract String getContent(); 5 | } 6 | -------------------------------------------------------------------------------- /src/main/java/ch09Future/q9_3/content/Content.java: -------------------------------------------------------------------------------- 1 | package ch09Future.q9_3.content; 2 | 3 | public interface Content { 4 | public abstract byte[] getBytes(); 5 | } 6 | -------------------------------------------------------------------------------- /src/main/java/ch09Future/a9_3a/content/Content.java: -------------------------------------------------------------------------------- 1 | package ch09Future.a9_3a.content; 2 | 3 | public interface Content { 4 | public abstract byte[] getBytes(); 5 | } 6 | -------------------------------------------------------------------------------- /src/main/java/ch09Future/a9_3b/content/Content.java: -------------------------------------------------------------------------------- 1 | package ch09Future.a9_3b.content; 2 | 3 | public interface Content { 4 | public abstract byte[] getBytes(); 5 | } 6 | -------------------------------------------------------------------------------- /src/main/java/ch12ActiveObject/a12_3b/searcher/Display.java: -------------------------------------------------------------------------------- 1 | package ch12ActiveObject.a12_3b.searcher; 2 | 3 | public interface Display { 4 | public abstract void display(String line); 5 | } 6 | -------------------------------------------------------------------------------- /src/main/java/ch12ActiveObject/a12_2a/activeobject/Result.java: -------------------------------------------------------------------------------- 1 | package ch12ActiveObject.a12_2a.activeobject; 2 | 3 | public abstract class Result { 4 | public abstract T getResultValue(); // 5 | } 6 | -------------------------------------------------------------------------------- /src/main/java/ch12ActiveObject/a12_3a/Main.java: -------------------------------------------------------------------------------- 1 | package ch12ActiveObject.a12_3a; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | new MyFrame(); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/ch12ActiveObject/a12_3a/activeobject/Result.java: -------------------------------------------------------------------------------- 1 | package ch12ActiveObject.a12_3a.activeobject; 2 | 3 | public abstract class Result { 4 | public abstract T getResultValue(); // 5 | } 6 | -------------------------------------------------------------------------------- /src/main/java/ch12ActiveObject/a12_3b/Main.java: -------------------------------------------------------------------------------- 1 | package ch12ActiveObject.a12_3b; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | new MyFrame(); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/ch12ActiveObject/sample/activeobject/Result.java: -------------------------------------------------------------------------------- 1 | package ch12ActiveObject.sample.activeobject; 2 | 3 | public abstract class Result { 4 | public abstract T getResultValue(); // 5 | } 6 | -------------------------------------------------------------------------------- /src/main/java/ch07ThreadPerMessage/a7_5a/Main.java: -------------------------------------------------------------------------------- 1 | package ch07ThreadPerMessage.a7_5a; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | new MyFrame(); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/ch07ThreadPerMessage/a7_5b/Main.java: -------------------------------------------------------------------------------- 1 | package ch07ThreadPerMessage.a7_5b; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | new MyFrame(); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/ch07ThreadPerMessage/a7_5c/Main.java: -------------------------------------------------------------------------------- 1 | package ch07ThreadPerMessage.a7_5c; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | new MyFrame(); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/ch07ThreadPerMessage/a7_5d/Main.java: -------------------------------------------------------------------------------- 1 | package ch07ThreadPerMessage.a7_5d; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | new MyFrame(); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/ch07ThreadPerMessage/q7_5/Main.java: -------------------------------------------------------------------------------- 1 | package ch07ThreadPerMessage.q7_5; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | new MyFrame(); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/ch10TwoPhaseTermination/a10_5/Main.java: -------------------------------------------------------------------------------- 1 | package ch10TwoPhaseTermination.a10_5; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | new MyFrame(); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/ch10TwoPhaseTermination/q10_5/Main.java: -------------------------------------------------------------------------------- 1 | package ch10TwoPhaseTermination.q10_5; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | new MyFrame(); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/ch01SingleThreadedExecution/a1_7c/Mutex.java: -------------------------------------------------------------------------------- 1 | package ch01SingleThreadedExecution.a1_7c; 2 | 3 | import java.util.concurrent.locks.ReentrantLock; 4 | 5 | public class Mutex extends ReentrantLock { 6 | } 7 | -------------------------------------------------------------------------------- /src/main/java/ch12ActiveObject/a12_3b/searcher/Searcher.java: -------------------------------------------------------------------------------- 1 | package ch12ActiveObject.a12_3b.searcher; 2 | 3 | public abstract class Searcher { 4 | public abstract void search(String word, Display display); 5 | } 6 | -------------------------------------------------------------------------------- /src/main/java/ch12ActiveObject/a12_3a/activeobject/ActiveObject.java: -------------------------------------------------------------------------------- 1 | package ch12ActiveObject.a12_3a.activeobject; 2 | 3 | public interface ActiveObject { 4 | public abstract Result search(String word); 5 | } 6 | -------------------------------------------------------------------------------- /src/main/java/ch04Balking/q4_4a/LivenessException.java: -------------------------------------------------------------------------------- 1 | package ch04Balking.q4_4a; 2 | 3 | public class LivenessException extends RuntimeException { 4 | public LivenessException(String msg) { 5 | super(msg); 6 | } 7 | } -------------------------------------------------------------------------------- /src/main/java/ch09Future/a9_4a/Data.java: -------------------------------------------------------------------------------- 1 | package ch09Future.a9_4a; 2 | 3 | import java.util.concurrent.ExecutionException; 4 | 5 | public interface Data { 6 | public abstract String getContent() throws ExecutionException; 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/ch09Future/a9_4b/Data.java: -------------------------------------------------------------------------------- 1 | package ch09Future.a9_4b; 2 | 3 | import java.util.concurrent.ExecutionException; 4 | 5 | public interface Data { 6 | public abstract String getContent() throws ExecutionException; 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/ch04Balking/a4_4a/LivenessException.java: -------------------------------------------------------------------------------- 1 | package ch04Balking.a4_4a; 2 | 3 | public class LivenessException extends RuntimeException { 4 | public LivenessException(String msg) { 5 | super(msg); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/ch04Balking/a4_4b/LivenessException.java: -------------------------------------------------------------------------------- 1 | package ch04Balking.a4_4b; 2 | 3 | public class LivenessException extends RuntimeException { 4 | public LivenessException(String msg) { 5 | super(msg); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/ch09Future/q9_3/content/Retriever.java: -------------------------------------------------------------------------------- 1 | package ch09Future.q9_3.content; 2 | 3 | public class Retriever { 4 | public static Content retrieve(String urlstr) { 5 | return new SyncContentImpl(urlstr); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/ch12ActiveObject/a12_3b/searcher/SearcherFactory.java: -------------------------------------------------------------------------------- 1 | package ch12ActiveObject.a12_3b.searcher; 2 | 3 | public class SearcherFactory { 4 | public static Searcher createSearcher() { 5 | return new SearcherImpl(); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/gmail/mosoft521/App.java: -------------------------------------------------------------------------------- 1 | package com.gmail.mosoft521; 2 | 3 | /** 4 | * Hello world! 5 | */ 6 | public class App { 7 | public static void main(String[] args) { 8 | System.out.println("Hello World!"); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/ch00Introduction1/qi1_3/Main.java: -------------------------------------------------------------------------------- 1 | package ch00Introduction1.qi1_3; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | new PrintThread("*").run(); 6 | new PrintThread("+").run(); 7 | } 8 | } 9 | /* 10 | 11 | */ -------------------------------------------------------------------------------- /src/main/java/ch00Introduction1/twoThreads/MyThread.java: -------------------------------------------------------------------------------- 1 | package ch00Introduction1.twoThreads; 2 | 3 | public class MyThread extends Thread { 4 | public void run() { 5 | for (int i = 0; i < 10000; i++) { 6 | System.out.print("Nice!"); 7 | } 8 | } 9 | } -------------------------------------------------------------------------------- /src/main/java/ch12ActiveObject/a12_2b/activeobject/ActiveObjectFactory.java: -------------------------------------------------------------------------------- 1 | package ch12ActiveObject.a12_2b.activeobject; 2 | 3 | public class ActiveObjectFactory { 4 | public static ActiveObject createActiveObject() { 5 | return new ActiveObjectImpl(); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/ch00Introduction1/singleThread/Main.java: -------------------------------------------------------------------------------- 1 | package ch00Introduction1.singleThread; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | for (int i = 0; i < 10000; i++) { 6 | System.out.print("Good!"); 7 | } 8 | } 9 | } -------------------------------------------------------------------------------- /src/main/java/ch12ActiveObject/jucSample/activeobject/ActiveObjectFactory.java: -------------------------------------------------------------------------------- 1 | package ch12ActiveObject.jucSample.activeobject; 2 | 3 | public class ActiveObjectFactory { 4 | public static ActiveObject createActiveObject() { 5 | return new ActiveObjectImpl(); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/ch02Immutable/q2_2/Main.java: -------------------------------------------------------------------------------- 1 | package ch02Immutable.q2_2; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | String s = "BAT"; 6 | System.out.println(s.replace('B', 'C')); // 将'B'替换为'C' 7 | } 8 | } 9 | /* 10 | CAT 11 | */ -------------------------------------------------------------------------------- /src/main/java/ch04Balking/q4_5/Main.java: -------------------------------------------------------------------------------- 1 | package ch04Balking.q4_5; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | Thread thread = new TestThread(); 6 | while (true) { 7 | thread.start(); 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/ch00Introduction1/printThread/Main.java: -------------------------------------------------------------------------------- 1 | package ch00Introduction1.printThread; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | new PrintThread("Good!").start(); 6 | new PrintThread("Nice!").start(); 7 | } 8 | } 9 | /* 10 | 11 | */ -------------------------------------------------------------------------------- /src/main/java/ch12ActiveObject/sample/activeobject/ActiveObject.java: -------------------------------------------------------------------------------- 1 | package ch12ActiveObject.sample.activeobject; 2 | 3 | public interface ActiveObject { 4 | public abstract Result makeString(int count, char fillchar); 5 | 6 | public abstract void displayString(String string); 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/ch00Introduction1/printer/Main.java: -------------------------------------------------------------------------------- 1 | package ch00Introduction1.printer; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | new Thread(new Printer("Good!")).start(); 6 | new Thread(new Printer("Nice!")).start(); 7 | } 8 | } 9 | /* 10 | 11 | */ -------------------------------------------------------------------------------- /src/main/java/ch05ProducerConsumer/q5_2/Main.java: -------------------------------------------------------------------------------- 1 | package ch05ProducerConsumer.q5_2; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | new MakerThread("Alice", new Table(3), 31415).start(); 6 | new EaterThread("Bobby", new Table(3), 92653).start(); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/ch07ThreadPerMessage/a7_7a/Main.java: -------------------------------------------------------------------------------- 1 | package ch07ThreadPerMessage.a7_7a; 2 | 3 | public class Main { 4 | public static void main(String args[]) { 5 | System.out.println("BEGIN"); 6 | Object obj = new Object(); 7 | Blackhole.enter(obj); 8 | System.out.println("END"); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/ch07ThreadPerMessage/a7_7b/Main.java: -------------------------------------------------------------------------------- 1 | package ch07ThreadPerMessage.a7_7b; 2 | 3 | public class Main { 4 | public static void main(String args[]) { 5 | System.out.println("BEGIN"); 6 | Object obj = new Object(); 7 | Blackhole.enter(obj); 8 | System.out.println("END"); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/ch07ThreadPerMessage/q7_7/Main.java: -------------------------------------------------------------------------------- 1 | package ch07ThreadPerMessage.q7_7; 2 | 3 | public class Main { 4 | public static void main(String args[]) { 5 | System.out.println("BEGIN"); 6 | Object obj = new Object(); 7 | Blackhole.enter(obj); 8 | System.out.println("END"); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/ch11ThreadSpecificStorage/a11_3/Main.java: -------------------------------------------------------------------------------- 1 | package ch11ThreadSpecificStorage.a11_3; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | new ClientThread("Alice").start(); 6 | new ClientThread("Bobby").start(); 7 | new ClientThread("Chris").start(); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/ch11ThreadSpecificStorage/q11_4/Main.java: -------------------------------------------------------------------------------- 1 | package ch11ThreadSpecificStorage.q11_4; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | new ClientThread("Alice").start(); 6 | new ClientThread("Bobby").start(); 7 | new ClientThread("Chris").start(); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/ch04Balking/a4_2b/Main.java: -------------------------------------------------------------------------------- 1 | package ch04Balking.a4_2b; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | Data data = new Data("data.txt", "(empty)"); 6 | new ChangerThread("ChangerThread", data).start(); 7 | new SaverThread("SaverThread", data).start(); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/ch11ThreadSpecificStorage/sample2/Main.java: -------------------------------------------------------------------------------- 1 | package ch11ThreadSpecificStorage.sample2; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | new ClientThread("Alice").start(); 6 | new ClientThread("Bobby").start(); 7 | new ClientThread("Chris").start(); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/ch01SingleThreadedExecution/a1_6a/Tool.java: -------------------------------------------------------------------------------- 1 | package ch01SingleThreadedExecution.a1_6a; 2 | 3 | public class Tool { 4 | private final String name; 5 | 6 | public Tool(String name) { 7 | this.name = name; 8 | } 9 | 10 | public String toString() { 11 | return "[ " + name + " ]"; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/ch01SingleThreadedExecution/a1_6b/Tool.java: -------------------------------------------------------------------------------- 1 | package ch01SingleThreadedExecution.a1_6b; 2 | 3 | public class Tool { 4 | private final String name; 5 | 6 | public Tool(String name) { 7 | this.name = name; 8 | } 9 | 10 | public String toString() { 11 | return "[ " + name + " ]"; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/ch01SingleThreadedExecution/q1_6/Tool.java: -------------------------------------------------------------------------------- 1 | package ch01SingleThreadedExecution.q1_6; 2 | 3 | public class Tool { 4 | private final String name; 5 | 6 | public Tool(String name) { 7 | this.name = name; 8 | } 9 | 10 | public String toString() { 11 | return "[ " + name + " ]"; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/ch08WorkerThread/a8_5/Main.java: -------------------------------------------------------------------------------- 1 | package ch08WorkerThread.a8_5; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | System.out.println(Thread.currentThread().getName() + ":BEGIN"); 6 | new MyFrame(); 7 | System.out.println(Thread.currentThread().getName() + ":END"); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/ch08WorkerThread/q8_5/Main.java: -------------------------------------------------------------------------------- 1 | package ch08WorkerThread.q8_5; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | System.out.println(Thread.currentThread().getName() + ":BEGIN"); 6 | new MyFrame(); 7 | System.out.println(Thread.currentThread().getName() + ":END"); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/ch00Introduction1/twoThreads/Main.java: -------------------------------------------------------------------------------- 1 | package ch00Introduction1.twoThreads; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | MyThread t = new MyThread(); 6 | t.start(); 7 | for (int i = 0; i < 10000; i++) { 8 | System.out.print("Good!"); 9 | } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/ch02Immutable/sample/Main.java: -------------------------------------------------------------------------------- 1 | package ch02Immutable.sample; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | Person alice = new Person("Alice", "Alaska"); 6 | new PrintPersonThread(alice).start(); 7 | new PrintPersonThread(alice).start(); 8 | new PrintPersonThread(alice).start(); 9 | } 10 | } -------------------------------------------------------------------------------- /src/main/java/ch07ThreadPerMessage/q7_6/Main.java: -------------------------------------------------------------------------------- 1 | package ch07ThreadPerMessage.q7_6; 2 | 3 | import java.io.IOException; 4 | 5 | public class Main { 6 | public static void main(String args[]) { 7 | try { 8 | new MiniServer(8888).execute(); 9 | } catch (IOException e) { 10 | e.printStackTrace(); 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/ch12ActiveObject/a12_2a/activeobject/ActiveObject.java: -------------------------------------------------------------------------------- 1 | package ch12ActiveObject.a12_2a.activeobject; 2 | 3 | public interface ActiveObject { 4 | public abstract Result makeString(int count, char fillchar); 5 | 6 | public abstract void displayString(String string); 7 | 8 | public abstract Result add(String x, String y); 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/ch07ThreadPerMessage/a7_6a/Main.java: -------------------------------------------------------------------------------- 1 | package ch07ThreadPerMessage.a7_6a; 2 | 3 | import java.io.IOException; 4 | 5 | public class Main { 6 | public static void main(String args[]) { 7 | try { 8 | new MiniServer(8888).execute(); 9 | } catch (IOException e) { 10 | e.printStackTrace(); 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/ch07ThreadPerMessage/a7_6b/Main.java: -------------------------------------------------------------------------------- 1 | package ch07ThreadPerMessage.a7_6b; 2 | 3 | import java.io.IOException; 4 | 5 | public class Main { 6 | public static void main(String args[]) { 7 | try { 8 | new MiniServer(8888).execute(); 9 | } catch (IOException e) { 10 | e.printStackTrace(); 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/ch03GuardedSuspension/a3_3/Main.java: -------------------------------------------------------------------------------- 1 | package ch03GuardedSuspension.a3_3; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | RequestQueue requestQueue = new RequestQueue(); 6 | new ClientThread(requestQueue, "Alice", 3141592L).start(); 7 | new ServerThread(requestQueue, "Bobby", 6535897L).start(); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/ch05ProducerConsumer/a5_9/Main.java: -------------------------------------------------------------------------------- 1 | package ch05ProducerConsumer.a5_9; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | System.out.println("BEGIN"); 6 | try { 7 | Something.method(3000); 8 | } catch (InterruptedException e) { 9 | } 10 | System.out.println("END"); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/ch05ProducerConsumer/a5_9/Something.java: -------------------------------------------------------------------------------- 1 | package ch05ProducerConsumer.a5_9; 2 | 3 | public class Something { 4 | public static void method(long x) throws InterruptedException { 5 | if (x != 0) { 6 | Object object = new Object(); 7 | synchronized (object) { 8 | object.wait(x); 9 | } 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/ch05ProducerConsumer/q5_9/Something.java: -------------------------------------------------------------------------------- 1 | package ch05ProducerConsumer.q5_9; 2 | 3 | public class Something { 4 | public static void method(long x) throws InterruptedException { 5 | if (x != 0) { 6 | Object object = new Object(); 7 | synchronized (object) { 8 | object.wait(x); 9 | } 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/ch12ActiveObject/a12_2a/activeobject/RealResult.java: -------------------------------------------------------------------------------- 1 | package ch12ActiveObject.a12_2a.activeobject; 2 | 3 | class RealResult extends Result { 4 | private final T resultValue; 5 | 6 | public RealResult(T resultValue) { 7 | this.resultValue = resultValue; 8 | } 9 | 10 | public T getResultValue() { 11 | return resultValue; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/ch12ActiveObject/a12_3a/activeobject/RealResult.java: -------------------------------------------------------------------------------- 1 | package ch12ActiveObject.a12_3a.activeobject; 2 | 3 | class RealResult extends Result { 4 | private final T resultValue; 5 | 6 | public RealResult(T resultValue) { 7 | this.resultValue = resultValue; 8 | } 9 | 10 | public T getResultValue() { 11 | return resultValue; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/ch12ActiveObject/sample/activeobject/RealResult.java: -------------------------------------------------------------------------------- 1 | package ch12ActiveObject.sample.activeobject; 2 | 3 | class RealResult extends Result { 4 | private final T resultValue; 5 | 6 | public RealResult(T resultValue) { 7 | this.resultValue = resultValue; 8 | } 9 | 10 | public T getResultValue() { 11 | return resultValue; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/ch00Introduction1/sleep/Main.java: -------------------------------------------------------------------------------- 1 | package ch00Introduction1.sleep; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | for (int i = 0; i < 10; i++) { 6 | System.out.print("Good!"); 7 | try { 8 | Thread.sleep(1000); 9 | } catch (InterruptedException e) { 10 | } 11 | } 12 | } 13 | } -------------------------------------------------------------------------------- /src/main/java/ch01SingleThreadedExecution/q1_5/SecurityGate.java: -------------------------------------------------------------------------------- 1 | package ch01SingleThreadedExecution.q1_5; 2 | 3 | public class SecurityGate { 4 | private int counter = 0; 5 | 6 | public void enter() { 7 | counter++; 8 | } 9 | 10 | public void exit() { 11 | counter--; 12 | } 13 | 14 | public int getCounter() { 15 | return counter; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/ch12ActiveObject/jucSample/activeobject/ActiveObject.java: -------------------------------------------------------------------------------- 1 | package ch12ActiveObject.jucSample.activeobject; 2 | 3 | import java.util.concurrent.Future; 4 | 5 | public interface ActiveObject { 6 | public abstract Future makeString(int count, char fillchar); 7 | 8 | public abstract void displayString(String string); 9 | 10 | public abstract void shutdown(); 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/ch04Balking/a4_4a/Request.java: -------------------------------------------------------------------------------- 1 | package ch04Balking.a4_4a; 2 | 3 | public class Request { 4 | private final String name; 5 | 6 | public Request(String name) { 7 | this.name = name; 8 | } 9 | 10 | public String getName() { 11 | return name; 12 | } 13 | 14 | public String toString() { 15 | return "[ Request " + name + " ]"; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/ch04Balking/a4_4b/Request.java: -------------------------------------------------------------------------------- 1 | package ch04Balking.a4_4b; 2 | 3 | public class Request { 4 | private final String name; 5 | 6 | public Request(String name) { 7 | this.name = name; 8 | } 9 | 10 | public String getName() { 11 | return name; 12 | } 13 | 14 | public String toString() { 15 | return "[ Request " + name + " ]"; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/ch04Balking/init/Something.java: -------------------------------------------------------------------------------- 1 | package ch04Balking.init; 2 | 3 | public class Something { 4 | private boolean initialized = false; 5 | 6 | public synchronized void init() { 7 | if (initialized) { 8 | return; 9 | } 10 | doInit(); 11 | initialized = true; 12 | } 13 | 14 | private void doInit() { 15 | // 实际的初始化处理 16 | } 17 | } -------------------------------------------------------------------------------- /src/main/java/ch07ThreadPerMessage/a7_2/Main.java: -------------------------------------------------------------------------------- 1 | package ch07ThreadPerMessage.a7_2; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | System.out.println("main BEGIN"); 6 | Host host = new Host(); 7 | host.request(10, 'A'); 8 | host.request(20, 'B'); 9 | host.request(30, 'C'); 10 | System.out.println("main END"); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/ch07ThreadPerMessage/a7_3/Main.java: -------------------------------------------------------------------------------- 1 | package ch07ThreadPerMessage.a7_3; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | System.out.println("main BEGIN"); 6 | Host host = new Host(); 7 | host.request(10, 'A'); 8 | host.request(20, 'B'); 9 | host.request(30, 'C'); 10 | System.out.println("main END"); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/ch07ThreadPerMessage/a7_4a/Main.java: -------------------------------------------------------------------------------- 1 | package ch07ThreadPerMessage.a7_4a; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | System.out.println("main BEGIN"); 6 | Host host = new Host(); 7 | host.request(10, 'A'); 8 | host.request(20, 'B'); 9 | host.request(30, 'C'); 10 | System.out.println("main END"); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/ch07ThreadPerMessage/a7_4b/Main.java: -------------------------------------------------------------------------------- 1 | package ch07ThreadPerMessage.a7_4b; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | System.out.println("main BEGIN"); 6 | Host host = new Host(); 7 | host.request(10, 'A'); 8 | host.request(20, 'B'); 9 | host.request(30, 'C'); 10 | System.out.println("main END"); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/ch00Introduction1/printer/Printer.java: -------------------------------------------------------------------------------- 1 | package ch00Introduction1.printer; 2 | 3 | public class Printer implements Runnable { 4 | private String message; 5 | 6 | public Printer(String message) { 7 | this.message = message; 8 | } 9 | 10 | public void run() { 11 | for (int i = 0; i < 10000; i++) { 12 | System.out.print(message); 13 | } 14 | } 15 | } -------------------------------------------------------------------------------- /src/main/java/ch00Introduction1/qi1_3/PrintThread.java: -------------------------------------------------------------------------------- 1 | package ch00Introduction1.qi1_3; 2 | 3 | public class PrintThread extends Thread { 4 | private String message; 5 | 6 | public PrintThread(String message) { 7 | this.message = message; 8 | } 9 | 10 | public void run() { 11 | for (int i = 0; i < 1000; i++) { 12 | System.out.print(message); 13 | } 14 | } 15 | } -------------------------------------------------------------------------------- /src/main/java/ch01SingleThreadedExecution/q1_4/Point.java: -------------------------------------------------------------------------------- 1 | package ch01SingleThreadedExecution.q1_4; 2 | 3 | public final class Point { 4 | private int x; 5 | private int y; 6 | 7 | public Point(int x, int y) { 8 | this.x = x; 9 | this.y = y; 10 | } 11 | 12 | public synchronized void move(int dx, int dy) { 13 | x += dx; 14 | y += dy; 15 | } 16 | //(读到这里为止) 17 | } -------------------------------------------------------------------------------- /src/main/java/ch03GuardedSuspension/a3_5/Request.java: -------------------------------------------------------------------------------- 1 | package ch03GuardedSuspension.a3_5; 2 | 3 | public class Request { 4 | private final String name; 5 | 6 | public Request(String name) { 7 | this.name = name; 8 | } 9 | 10 | public String getName() { 11 | return name; 12 | } 13 | 14 | public String toString() { 15 | return "[ Request " + name + " ]"; 16 | } 17 | } -------------------------------------------------------------------------------- /src/main/java/ch03GuardedSuspension/a3_6/Request.java: -------------------------------------------------------------------------------- 1 | package ch03GuardedSuspension.a3_6; 2 | 3 | public class Request { 4 | private final String name; 5 | 6 | public Request(String name) { 7 | this.name = name; 8 | } 9 | 10 | public String getName() { 11 | return name; 12 | } 13 | 14 | public String toString() { 15 | return "[ Request " + name + " ]"; 16 | } 17 | } -------------------------------------------------------------------------------- /src/main/java/ch03GuardedSuspension/q3_5/Request.java: -------------------------------------------------------------------------------- 1 | package ch03GuardedSuspension.q3_5; 2 | 3 | public class Request { 4 | private final String name; 5 | 6 | public Request(String name) { 7 | this.name = name; 8 | } 9 | 10 | public String getName() { 11 | return name; 12 | } 13 | 14 | public String toString() { 15 | return "[ Request " + name + " ]"; 16 | } 17 | } -------------------------------------------------------------------------------- /src/main/java/ch03GuardedSuspension/q3_6/Request.java: -------------------------------------------------------------------------------- 1 | package ch03GuardedSuspension.q3_6; 2 | 3 | public class Request { 4 | private final String name; 5 | 6 | public Request(String name) { 7 | this.name = name; 8 | } 9 | 10 | public String getName() { 11 | return name; 12 | } 13 | 14 | public String toString() { 15 | return "[ Request " + name + " ]"; 16 | } 17 | } -------------------------------------------------------------------------------- /src/main/java/ch07ThreadPerMessage/sample/Main.java: -------------------------------------------------------------------------------- 1 | package ch07ThreadPerMessage.sample; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | System.out.println("main BEGIN"); 6 | Host host = new Host(); 7 | host.request(10, 'A'); 8 | host.request(20, 'B'); 9 | host.request(30, 'C'); 10 | System.out.println("main END"); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/ch02Immutable/jucSample3/Main.java: -------------------------------------------------------------------------------- 1 | package ch02Immutable.jucSample3; 2 | 3 | import java.util.List; 4 | import java.util.concurrent.CopyOnWriteArrayList; 5 | 6 | public class Main { 7 | public static void main(String[] args) { 8 | final List list = new CopyOnWriteArrayList(); 9 | new WriterThread(list).start(); 10 | new ReaderThread(list).start(); 11 | } 12 | } -------------------------------------------------------------------------------- /src/main/java/ch03GuardedSuspension/a3_3/Request.java: -------------------------------------------------------------------------------- 1 | package ch03GuardedSuspension.a3_3; 2 | 3 | public class Request { 4 | private final String name; 5 | 6 | public Request(String name) { 7 | this.name = name; 8 | } 9 | 10 | public String getName() { 11 | return name; 12 | } 13 | 14 | public String toString() { 15 | return "[ Request " + name + " ]"; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/ch03GuardedSuspension/sample/Request.java: -------------------------------------------------------------------------------- 1 | package ch03GuardedSuspension.sample; 2 | 3 | public class Request { 4 | private final String name; 5 | 6 | public Request(String name) { 7 | this.name = name; 8 | } 9 | 10 | public String getName() { 11 | return name; 12 | } 13 | 14 | public String toString() { 15 | return "[ Request " + name + " ]"; 16 | } 17 | } -------------------------------------------------------------------------------- /src/main/java/ch07ThreadPerMessage/jucSample1/Main.java: -------------------------------------------------------------------------------- 1 | package ch07ThreadPerMessage.jucSample1; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | System.out.println("main BEGIN"); 6 | Host host = new Host(); 7 | host.request(10, 'A'); 8 | host.request(20, 'B'); 9 | host.request(30, 'C'); 10 | System.out.println("main END"); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/ch07ThreadPerMessage/jucSample2/Main.java: -------------------------------------------------------------------------------- 1 | package ch07ThreadPerMessage.jucSample2; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | System.out.println("main BEGIN"); 6 | Host host = new Host(); 7 | host.request(10, 'A'); 8 | host.request(20, 'B'); 9 | host.request(30, 'C'); 10 | System.out.println("main END"); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/ch03GuardedSuspension/jucSample/Request.java: -------------------------------------------------------------------------------- 1 | package ch03GuardedSuspension.jucSample; 2 | 3 | public class Request { 4 | private final String name; 5 | 6 | public Request(String name) { 7 | this.name = name; 8 | } 9 | 10 | public String getName() { 11 | return name; 12 | } 13 | 14 | public String toString() { 15 | return "[ Request " + name + " ]"; 16 | } 17 | } -------------------------------------------------------------------------------- /src/main/java/ch00Introduction1/jucThreadFactory/Printer.java: -------------------------------------------------------------------------------- 1 | package ch00Introduction1.jucThreadFactory; 2 | 3 | public class Printer implements Runnable { 4 | private String message; 5 | 6 | public Printer(String message) { 7 | this.message = message; 8 | } 9 | 10 | public void run() { 11 | for (int i = 0; i < 10000; i++) { 12 | System.out.print(message); 13 | } 14 | } 15 | } -------------------------------------------------------------------------------- /src/main/java/ch00Introduction1/printThread/PrintThread.java: -------------------------------------------------------------------------------- 1 | package ch00Introduction1.printThread; 2 | 3 | public class PrintThread extends Thread { 4 | private String message; 5 | 6 | public PrintThread(String message) { 7 | this.message = message; 8 | } 9 | 10 | public void run() { 11 | for (int i = 0; i < 10000; i++) { 12 | System.out.print(message); 13 | } 14 | } 15 | } -------------------------------------------------------------------------------- /src/main/java/ch04Balking/a4_4a/Main.java: -------------------------------------------------------------------------------- 1 | package ch04Balking.a4_4a; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | RequestQueue requestQueue1 = new RequestQueue(); 6 | RequestQueue requestQueue2 = new RequestQueue(); 7 | new TalkThread(requestQueue1, requestQueue2, "Alice").start(); 8 | new TalkThread(requestQueue2, requestQueue1, "Bobby").start(); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/ch04Balking/a4_4b/Main.java: -------------------------------------------------------------------------------- 1 | package ch04Balking.a4_4b; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | RequestQueue requestQueue1 = new RequestQueue(); 6 | RequestQueue requestQueue2 = new RequestQueue(); 7 | new TalkThread(requestQueue1, requestQueue2, "Alice").start(); 8 | new TalkThread(requestQueue2, requestQueue1, "Bobby").start(); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/ch08WorkerThread/a8_2/Main.java: -------------------------------------------------------------------------------- 1 | package ch08WorkerThread.a8_2; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | Channel channel = new Channel(5); // 工人线程的个数 6 | channel.startWorkers(); 7 | new ClientThread("Alice", channel).start(); 8 | new ClientThread("Bobby", channel).start(); 9 | new ClientThread("Chris", channel).start(); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/ch08WorkerThread/sample/Main.java: -------------------------------------------------------------------------------- 1 | package ch08WorkerThread.sample; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | Channel channel = new Channel(5); // 工人线程的个数 6 | channel.startWorkers(); 7 | new ClientThread("Alice", channel).start(); 8 | new ClientThread("Bobby", channel).start(); 9 | new ClientThread("Chris", channel).start(); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/ch07ThreadPerMessage/a7_2/Host.java: -------------------------------------------------------------------------------- 1 | package ch07ThreadPerMessage.a7_2; 2 | 3 | public class Host { 4 | private final Helper helper = new Helper(); 5 | 6 | public void request(final int count, final char c) { 7 | System.out.println(" request(" + count + ", " + c + ") BEGIN"); 8 | helper.handle(count, c); 9 | System.out.println(" request(" + count + ", " + c + ") END"); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/ch07ThreadPerMessage/a7_4a/Host.java: -------------------------------------------------------------------------------- 1 | package ch07ThreadPerMessage.a7_4a; 2 | 3 | public class Host { 4 | private Helper helper = new Helper(); 5 | 6 | public void request(int count, char c) { 7 | System.out.println(" request(" + count + ", " + c + ") BEGIN"); 8 | new HelperThread(helper, count, c).start(); 9 | System.out.println(" request(" + count + ", " + c + ") END"); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/ch08WorkerThread/a8_2/Channel.java: -------------------------------------------------------------------------------- 1 | package ch08WorkerThread.a8_2; 2 | 3 | public final class Channel { 4 | public Channel(int threads) { 5 | } 6 | 7 | public void startWorkers() { 8 | } 9 | 10 | public void putRequest(final Request request) { 11 | new Thread() { 12 | public void run() { 13 | request.execute(); 14 | } 15 | }.start(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/ch08WorkerThread/a8_3b/Channel.java: -------------------------------------------------------------------------------- 1 | package ch08WorkerThread.a8_3b; 2 | 3 | public final class Channel { 4 | public Channel(int threads) { 5 | } 6 | 7 | public void startWorkers() { 8 | } 9 | 10 | public void putRequest(final Request request) { 11 | new Thread() { 12 | public void run() { 13 | request.execute(); 14 | } 15 | }.start(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/ch02Immutable/sample/PrintPersonThread.java: -------------------------------------------------------------------------------- 1 | package ch02Immutable.sample; 2 | 3 | public class PrintPersonThread extends Thread { 4 | private Person person; 5 | 6 | public PrintPersonThread(Person person) { 7 | this.person = person; 8 | } 9 | 10 | public void run() { 11 | while (true) { 12 | System.out.println(Thread.currentThread().getName() + " prints " + person); 13 | } 14 | } 15 | } -------------------------------------------------------------------------------- /src/main/java/ch12ActiveObject/a12_2a/Main.java: -------------------------------------------------------------------------------- 1 | package ch12ActiveObject.a12_2a; 2 | 3 | import ch12ActiveObject.a12_2a.activeobject.ActiveObject; 4 | import ch12ActiveObject.a12_2a.activeobject.ActiveObjectFactory; 5 | 6 | public class Main { 7 | public static void main(String[] args) { 8 | ActiveObject activeObject = ActiveObjectFactory.createActiveObject(); 9 | new AddClientThread("Diana", activeObject).start(); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/ch12ActiveObject/q12_2a/Main.java: -------------------------------------------------------------------------------- 1 | package ch12ActiveObject.q12_2a; 2 | 3 | import ch12ActiveObject.a12_2a.activeobject.ActiveObject; 4 | import ch12ActiveObject.a12_2a.activeobject.ActiveObjectFactory; 5 | 6 | public class Main { 7 | public static void main(String[] args) { 8 | ActiveObject activeObject = ActiveObjectFactory.createActiveObject(); 9 | new AddClientThread("Diana", activeObject).start(); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/ch01SingleThreadedExecution/a1_5/CrackerThread.java: -------------------------------------------------------------------------------- 1 | package ch01SingleThreadedExecution.a1_5; 2 | 3 | public class CrackerThread extends Thread { 4 | private final SecurityGate gate; 5 | 6 | public CrackerThread(SecurityGate gate) { 7 | this.gate = gate; 8 | } 9 | 10 | public void run() { 11 | for (int i = 0; i < 10; i++) { 12 | gate.enter(); 13 | gate.exit(); 14 | } 15 | } 16 | } -------------------------------------------------------------------------------- /src/main/java/ch02Immutable/jucSample2/Main.java: -------------------------------------------------------------------------------- 1 | package ch02Immutable.jucSample2; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Collections; 5 | import java.util.List; 6 | 7 | public class Main { 8 | public static void main(String[] args) { 9 | final List list = Collections.synchronizedList(new ArrayList()); 10 | new WriterThread(list).start(); 11 | new ReaderThread(list).start(); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/ch12ActiveObject/a12_2a/activeobject/MethodRequest.java: -------------------------------------------------------------------------------- 1 | package ch12ActiveObject.a12_2a.activeobject; 2 | 3 | abstract class MethodRequest { 4 | protected final Servant servant; 5 | protected final FutureResult future; 6 | 7 | protected MethodRequest(Servant servant, FutureResult future) { 8 | this.servant = servant; 9 | this.future = future; 10 | } 11 | 12 | public abstract void execute(); 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/ch12ActiveObject/a12_3a/activeobject/MethodRequest.java: -------------------------------------------------------------------------------- 1 | package ch12ActiveObject.a12_3a.activeobject; 2 | 3 | abstract class MethodRequest { 4 | protected final Servant servant; 5 | protected final FutureResult future; 6 | 7 | protected MethodRequest(Servant servant, FutureResult future) { 8 | this.servant = servant; 9 | this.future = future; 10 | } 11 | 12 | public abstract void execute(); 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/ch12ActiveObject/sample/activeobject/MethodRequest.java: -------------------------------------------------------------------------------- 1 | package ch12ActiveObject.sample.activeobject; 2 | 3 | abstract class MethodRequest { 4 | protected final Servant servant; 5 | protected final FutureResult future; 6 | 7 | protected MethodRequest(Servant servant, FutureResult future) { 8 | this.servant = servant; 9 | this.future = future; 10 | } 11 | 12 | public abstract void execute(); 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/ch12ActiveObject/a12_2b/activeobject/ActiveObject.java: -------------------------------------------------------------------------------- 1 | package ch12ActiveObject.a12_2b.activeobject; 2 | 3 | import java.util.concurrent.Future; 4 | 5 | public interface ActiveObject { 6 | public abstract Future makeString(int count, char fillchar); 7 | 8 | public abstract void displayString(String string); 9 | 10 | public abstract Future add(String x, String y); 11 | 12 | public abstract void shutdown(); 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/ch01SingleThreadedExecution/q1_6/Main.java: -------------------------------------------------------------------------------- 1 | package ch01SingleThreadedExecution.q1_6; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | System.out.println("Testing EaterThread, hit CTRL+C to exit."); 6 | Tool spoon = new Tool("Spoon"); 7 | Tool fork = new Tool("Fork"); 8 | new EaterThread("Alice", spoon, fork).start(); 9 | new EaterThread("Bobby", fork, spoon).start(); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/ch01SingleThreadedExecution/a1_6a/Main.java: -------------------------------------------------------------------------------- 1 | package ch01SingleThreadedExecution.a1_6a; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | System.out.println("Testing EaterThread, hit CTRL+C to exit."); 6 | Tool spoon = new Tool("Spoon"); 7 | Tool fork = new Tool("Fork"); 8 | new EaterThread("Alice", spoon, fork).start(); 9 | new EaterThread("Bobby", spoon, fork).start(); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/ch01SingleThreadedExecution/a1_6b/Pair.java: -------------------------------------------------------------------------------- 1 | package ch01SingleThreadedExecution.a1_6b; 2 | 3 | public class Pair { 4 | private final Tool lefthand; 5 | private final Tool righthand; 6 | 7 | public Pair(Tool lefthand, Tool righthand) { 8 | this.lefthand = lefthand; 9 | this.righthand = righthand; 10 | } 11 | 12 | public String toString() { 13 | return "[ " + lefthand + " and " + righthand + " ]"; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/ch04Balking/q4_5/TestThread.java: -------------------------------------------------------------------------------- 1 | package ch04Balking.q4_5; 2 | 3 | public class TestThread extends Thread { 4 | public void run() { 5 | System.out.print("BEGIN"); 6 | for (int i = 0; i < 50; i++) { 7 | System.out.print("."); 8 | try { 9 | Thread.sleep(100); 10 | } catch (InterruptedException e) { 11 | } 12 | } 13 | System.out.println("END"); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/ch00Introduction1/ai1_4/ClientThread.java: -------------------------------------------------------------------------------- 1 | package ch00Introduction1.ai1_4; 2 | 3 | public class ClientThread extends Thread { 4 | private Bank bank; 5 | 6 | public ClientThread(Bank bank) { 7 | this.bank = bank; 8 | } 9 | 10 | public void run() { 11 | while (true) { 12 | boolean ok = bank.withdraw(1000); 13 | if (ok) { 14 | bank.deposit(1000); 15 | } 16 | } 17 | } 18 | } -------------------------------------------------------------------------------- /src/main/java/ch00Introduction1/ai1_4/Main.java: -------------------------------------------------------------------------------- 1 | package ch00Introduction1.ai1_4; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | Bank bank = new Bank("A Bad Bank", 1000); // 创建一个1000日元的银行账户 6 | new ClientThread(bank).start(); 7 | new ClientThread(bank).start(); 8 | } 9 | } 10 | /* 11 | -----① 12 | 可用余额为负数! money = -2000 13 | 可用余额为负数! money = -2000 14 | -----② 15 | 可用余额为负数! money = 0 16 | 可用余额为负数! money = -1000 17 | */ -------------------------------------------------------------------------------- /src/main/java/ch01SingleThreadedExecution/a1_7a/Main.java: -------------------------------------------------------------------------------- 1 | package ch01SingleThreadedExecution.a1_7a; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | System.out.println("Testing Gate, hit CTRL+C to exit."); 6 | Gate gate = new Gate(); 7 | new UserThread(gate, "Alice", "Alaska").start(); 8 | new UserThread(gate, "Bobby", "Brazil").start(); 9 | new UserThread(gate, "Chris", "Canada").start(); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/ch01SingleThreadedExecution/a1_7b/Main.java: -------------------------------------------------------------------------------- 1 | package ch01SingleThreadedExecution.a1_7b; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | System.out.println("Testing Gate, hit CTRL+C to exit."); 6 | Gate gate = new Gate(); 7 | new UserThread(gate, "Alice", "Alaska").start(); 8 | new UserThread(gate, "Bobby", "Brazil").start(); 9 | new UserThread(gate, "Chris", "Canada").start(); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/ch01SingleThreadedExecution/a1_7c/Main.java: -------------------------------------------------------------------------------- 1 | package ch01SingleThreadedExecution.a1_7c; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | System.out.println("Testing Gate, hit CTRL+C to exit."); 6 | Gate gate = new Gate(); 7 | new UserThread(gate, "Alice", "Alaska").start(); 8 | new UserThread(gate, "Bobby", "Brazil").start(); 9 | new UserThread(gate, "Chris", "Canada").start(); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/ch02Immutable/q2_5/Point.java: -------------------------------------------------------------------------------- 1 | package ch02Immutable.q2_5; 2 | 3 | public class Point { 4 | public int x; 5 | public int y; 6 | 7 | public Point(int x, int y) { 8 | this.x = x; 9 | this.y = y; 10 | } 11 | 12 | public int getX() { 13 | return x; 14 | } 15 | 16 | public int getY() { 17 | return y; 18 | } 19 | 20 | public String toString() { 21 | return "(" + x + "," + y + ")"; 22 | } 23 | } -------------------------------------------------------------------------------- /src/main/java/ch09Future/a9_3a/content/Retriever.java: -------------------------------------------------------------------------------- 1 | package ch09Future.a9_3a.content; 2 | 3 | public class Retriever { 4 | public static Content retrieve(final String urlstr) { 5 | final AsyncContentImpl future = new AsyncContentImpl(); 6 | 7 | new Thread() { 8 | public void run() { 9 | future.setContent(new SyncContentImpl(urlstr)); 10 | } 11 | }.start(); 12 | 13 | return future; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/ch12ActiveObject/a12_2a/activeobject/DisplayStringRequest.java: -------------------------------------------------------------------------------- 1 | package ch12ActiveObject.a12_2a.activeobject; 2 | 3 | class DisplayStringRequest extends MethodRequest { 4 | private final String string; 5 | 6 | public DisplayStringRequest(Servant servant, String string) { 7 | super(servant, null); 8 | this.string = string; 9 | } 10 | 11 | public void execute() { 12 | servant.displayString(string); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/ch12ActiveObject/sample/activeobject/DisplayStringRequest.java: -------------------------------------------------------------------------------- 1 | package ch12ActiveObject.sample.activeobject; 2 | 3 | class DisplayStringRequest extends MethodRequest { 4 | private final String string; 5 | 6 | public DisplayStringRequest(Servant servant, String string) { 7 | super(servant, null); 8 | this.string = string; 9 | } 10 | 11 | public void execute() { 12 | servant.displayString(string); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/ch02Immutable/a2_5a/Point.java: -------------------------------------------------------------------------------- 1 | package ch02Immutable.a2_5a; 2 | 3 | public class Point { 4 | public int x; 5 | public int y; 6 | 7 | public Point(int x, int y) { 8 | this.x = x; 9 | this.y = y; 10 | } 11 | 12 | public int getX() { 13 | return x; 14 | } 15 | 16 | public int getY() { 17 | return y; 18 | } 19 | 20 | public String toString() { 21 | return "(" + x + "," + y + ")"; 22 | } 23 | } -------------------------------------------------------------------------------- /src/main/java/ch02Immutable/a2_5b/Point.java: -------------------------------------------------------------------------------- 1 | package ch02Immutable.a2_5b; 2 | 3 | public class Point { 4 | public int x; 5 | public int y; 6 | 7 | public Point(int x, int y) { 8 | this.x = x; 9 | this.y = y; 10 | } 11 | 12 | public int getX() { 13 | return x; 14 | } 15 | 16 | public int getY() { 17 | return y; 18 | } 19 | 20 | public String toString() { 21 | return "(" + x + "," + y + ")"; 22 | } 23 | } -------------------------------------------------------------------------------- /src/main/java/ch07ThreadPerMessage/q7_5/Service.java: -------------------------------------------------------------------------------- 1 | package ch07ThreadPerMessage.q7_5; 2 | 3 | public class Service { 4 | public static void service() { 5 | System.out.print("service"); 6 | for (int i = 0; i < 50; i++) { 7 | System.out.print("."); 8 | try { 9 | Thread.sleep(100); 10 | } catch (InterruptedException e) { 11 | } 12 | } 13 | System.out.println("done."); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/ch08WorkerThread/a8_3a/WorkerThread.java: -------------------------------------------------------------------------------- 1 | package ch08WorkerThread.a8_3a; 2 | 3 | public class WorkerThread extends Thread { 4 | private final Channel channel; 5 | 6 | public WorkerThread(String name, Channel channel) { 7 | super(name); 8 | this.channel = channel; 9 | } 10 | 11 | public void run() { 12 | while (true) { 13 | Request request = channel.takeRequest(); 14 | request.execute(); 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/ch07ThreadPerMessage/a7_4a/HelperThread.java: -------------------------------------------------------------------------------- 1 | package ch07ThreadPerMessage.a7_4a; 2 | 3 | public class HelperThread extends Thread { 4 | private final Helper helper; 5 | private final int count; 6 | private final char c; 7 | 8 | public HelperThread(Helper helper, int count, char c) { 9 | this.helper = helper; 10 | this.count = count; 11 | this.c = c; 12 | } 13 | 14 | public void run() { 15 | helper.handle(count, c); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/ch08WorkerThread/sample/WorkerThread.java: -------------------------------------------------------------------------------- 1 | package ch08WorkerThread.sample; 2 | 3 | public class WorkerThread extends Thread { 4 | private final Channel channel; 5 | 6 | public WorkerThread(String name, Channel channel) { 7 | super(name); 8 | this.channel = channel; 9 | } 10 | 11 | public void run() { 12 | while (true) { 13 | Request request = channel.takeRequest(); 14 | request.execute(); 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/ch01SingleThreadedExecution/a1_6b/Main.java: -------------------------------------------------------------------------------- 1 | package ch01SingleThreadedExecution.a1_6b; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | System.out.println("Testing EaterThread, hit CTRL+C to exit."); 6 | Tool spoon = new Tool("Spoon"); 7 | Tool fork = new Tool("Fork"); 8 | Pair pair = new Pair(spoon, fork); 9 | new EaterThread("Alice", pair).start(); 10 | new EaterThread("Bobby", pair).start(); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/ch03GuardedSuspension/q3_5/Main.java: -------------------------------------------------------------------------------- 1 | package ch03GuardedSuspension.q3_5; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | RequestQueue requestQueue1 = new RequestQueue(); 6 | RequestQueue requestQueue2 = new RequestQueue(); 7 | new TalkThread(requestQueue1, requestQueue2, "Alice").start(); 8 | new TalkThread(requestQueue2, requestQueue1, "Bobby").start(); 9 | } 10 | } 11 | /* 12 | Alice:BEGIN 13 | Bobby:BEGIN 14 | dead??? 15 | */ -------------------------------------------------------------------------------- /src/main/java/ch02Immutable/a2_4/UserInfo.java: -------------------------------------------------------------------------------- 1 | package ch02Immutable.a2_4; 2 | 3 | public final class UserInfo { 4 | private final StringBuffer info; 5 | 6 | public UserInfo(String name, String address) { 7 | this.info = new StringBuffer(""); 8 | } 9 | 10 | public StringBuffer getInfo() { 11 | return info; 12 | } 13 | 14 | public String toString() { 15 | return "[ UserInfo: " + info + " ]"; 16 | } 17 | } -------------------------------------------------------------------------------- /src/main/java/ch02Immutable/q2_4/UserInfo.java: -------------------------------------------------------------------------------- 1 | package ch02Immutable.q2_4; 2 | 3 | public final class UserInfo { 4 | private final StringBuffer info; 5 | 6 | public UserInfo(String name, String address) { 7 | this.info = new StringBuffer(""); 8 | } 9 | 10 | public StringBuffer getInfo() { 11 | return info; 12 | } 13 | 14 | public String toString() { 15 | return "[ UserInfo: " + info + " ]"; 16 | } 17 | } -------------------------------------------------------------------------------- /src/main/java/ch02Immutable/jucSample1/WriterThread.java: -------------------------------------------------------------------------------- 1 | package ch02Immutable.jucSample1; 2 | 3 | import java.util.List; 4 | 5 | public class WriterThread extends Thread { 6 | private final List list; 7 | 8 | public WriterThread(List list) { 9 | super("WriterThread"); 10 | this.list = list; 11 | } 12 | 13 | public void run() { 14 | for (int i = 0; true; i++) { 15 | list.add(i); 16 | list.remove(0); 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/ch02Immutable/jucSample2/WriterThread.java: -------------------------------------------------------------------------------- 1 | package ch02Immutable.jucSample2; 2 | 3 | import java.util.List; 4 | 5 | public class WriterThread extends Thread { 6 | private final List list; 7 | 8 | public WriterThread(List list) { 9 | super("WriterThread"); 10 | this.list = list; 11 | } 12 | 13 | public void run() { 14 | for (int i = 0; true; i++) { 15 | list.add(i); 16 | list.remove(0); 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/ch02Immutable/jucSample3/WriterThread.java: -------------------------------------------------------------------------------- 1 | package ch02Immutable.jucSample3; 2 | 3 | import java.util.List; 4 | 5 | public class WriterThread extends Thread { 6 | private final List list; 7 | 8 | public WriterThread(List list) { 9 | super("WriterThread"); 10 | this.list = list; 11 | } 12 | 13 | public void run() { 14 | for (int i = 0; true; i++) { 15 | list.add(i); 16 | list.remove(0); 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/ch07ThreadPerMessage/q7_7/Blackhole.java: -------------------------------------------------------------------------------- 1 | package ch07ThreadPerMessage.q7_7; 2 | 3 | public class Blackhole { 4 | public static void enter(Object obj) { 5 | System.out.println("Step 1"); 6 | magic(obj); 7 | System.out.println("Step 2"); 8 | synchronized (obj) { 9 | System.out.println("Step 3 (never reached here)"); // 不会执行到这里 10 | } 11 | } 12 | 13 | public static void magic(final Object obj) { 14 | //(接下来请完成magic方法的编写) 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/ch12ActiveObject/a12_2a/activeobject/ActiveObjectFactory.java: -------------------------------------------------------------------------------- 1 | package ch12ActiveObject.a12_2a.activeobject; 2 | 3 | public class ActiveObjectFactory { 4 | public static ActiveObject createActiveObject() { 5 | Servant servant = new Servant(); 6 | ActivationQueue queue = new ActivationQueue(); 7 | SchedulerThread scheduler = new SchedulerThread(queue); 8 | Proxy proxy = new Proxy(scheduler, servant); 9 | scheduler.start(); 10 | return proxy; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/ch12ActiveObject/a12_3a/activeobject/ActiveObjectFactory.java: -------------------------------------------------------------------------------- 1 | package ch12ActiveObject.a12_3a.activeobject; 2 | 3 | public class ActiveObjectFactory { 4 | public static ActiveObject createActiveObject() { 5 | Servant servant = new Servant(); 6 | ActivationQueue queue = new ActivationQueue(); 7 | SchedulerThread scheduler = new SchedulerThread(queue); 8 | Proxy proxy = new Proxy(scheduler, servant); 9 | scheduler.start(); 10 | return proxy; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/ch12ActiveObject/sample/activeobject/ActiveObjectFactory.java: -------------------------------------------------------------------------------- 1 | package ch12ActiveObject.sample.activeobject; 2 | 3 | public class ActiveObjectFactory { 4 | public static ActiveObject createActiveObject() { 5 | Servant servant = new Servant(); 6 | ActivationQueue queue = new ActivationQueue(); 7 | SchedulerThread scheduler = new SchedulerThread(queue); 8 | Proxy proxy = new Proxy(scheduler, servant); 9 | scheduler.start(); 10 | return proxy; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/ch05ProducerConsumer/jucSample2/Main.java: -------------------------------------------------------------------------------- 1 | package ch05ProducerConsumer.jucSample2; 2 | 3 | import java.util.concurrent.Exchanger; 4 | 5 | public class Main { 6 | public static void main(String[] args) { 7 | Exchanger exchanger = new Exchanger(); 8 | char[] buffer1 = new char[10]; 9 | char[] buffer2 = new char[10]; 10 | new ProducerThread(exchanger, buffer1, 314159).start(); 11 | new ConsumerThread(exchanger, buffer2, 265358).start(); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/ch08WorkerThread/a8_3a/ClientThread.java: -------------------------------------------------------------------------------- 1 | package ch08WorkerThread.a8_3a; 2 | 3 | public class ClientThread extends Thread { 4 | private final Channel channel; 5 | 6 | public ClientThread(String name, Channel channel) { 7 | super(name); 8 | this.channel = channel; 9 | } 10 | 11 | public void run() { 12 | for (int i = 0; true; i++) { 13 | Request request = new Request(getName(), i); 14 | channel.putRequest(request); 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/ch08WorkerThread/a8_3b/ClientThread.java: -------------------------------------------------------------------------------- 1 | package ch08WorkerThread.a8_3b; 2 | 3 | public class ClientThread extends Thread { 4 | private final Channel channel; 5 | 6 | public ClientThread(String name, Channel channel) { 7 | super(name); 8 | this.channel = channel; 9 | } 10 | 11 | public void run() { 12 | for (int i = 0; true; i++) { 13 | Request request = new Request(getName(), i); 14 | channel.putRequest(request); 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/ch12ActiveObject/a12_3a/activeobject/SearchRequest.java: -------------------------------------------------------------------------------- 1 | package ch12ActiveObject.a12_3a.activeobject; 2 | 3 | class SearchRequest extends MethodRequest { 4 | private final String word; 5 | 6 | public SearchRequest(Servant servant, FutureResult future, String word) { 7 | super(servant, future); 8 | this.word = word; 9 | } 10 | 11 | public void execute() { 12 | Result result = servant.search(word); 13 | future.setResult(result); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/ch01SingleThreadedExecution/a1_7a/Mutex.java: -------------------------------------------------------------------------------- 1 | package ch01SingleThreadedExecution.a1_7a; 2 | 3 | public final class Mutex { 4 | private boolean busy = false; 5 | 6 | public synchronized void lock() { 7 | while (busy) { 8 | try { 9 | wait(); 10 | } catch (InterruptedException e) { 11 | } 12 | } 13 | busy = true; 14 | } 15 | 16 | public synchronized void unlock() { 17 | busy = false; 18 | notifyAll(); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/ch07ThreadPerMessage/jucSample4/Main.java: -------------------------------------------------------------------------------- 1 | package ch07ThreadPerMessage.jucSample4; 2 | 3 | import java.util.concurrent.Executors; 4 | 5 | public class Main { 6 | public static void main(String[] args) { 7 | System.out.println("main BEGIN"); 8 | Host host = new Host( 9 | Executors.defaultThreadFactory() 10 | ); 11 | host.request(10, 'A'); 12 | host.request(20, 'B'); 13 | host.request(30, 'C'); 14 | System.out.println("main END"); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/ch09Future/q9_4/Main.java: -------------------------------------------------------------------------------- 1 | package ch09Future.q9_4; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | try { 6 | System.out.println("main BEGIN"); 7 | Host host = new Host(); 8 | 9 | Data data = host.request(-1, 'N'); 10 | 11 | System.out.println("data = " + data.getContent()); 12 | 13 | System.out.println("main END"); 14 | } catch (Exception e) { 15 | e.printStackTrace(); 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/ch11ThreadSpecificStorage/sample1/Main.java: -------------------------------------------------------------------------------- 1 | package ch11ThreadSpecificStorage.sample1; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | System.out.println("BEGIN"); 6 | for (int i = 0; i < 10; i++) { 7 | Log.println("main: i = " + i); 8 | try { 9 | Thread.sleep(100); 10 | } catch (InterruptedException e) { 11 | } 12 | } 13 | Log.close(); 14 | System.out.println("END"); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/ch00Introduction1/jucThreadFactory/Main.java: -------------------------------------------------------------------------------- 1 | package ch00Introduction1.jucThreadFactory; 2 | 3 | import java.util.concurrent.Executors; 4 | import java.util.concurrent.ThreadFactory; 5 | 6 | public class Main { 7 | public static void main(String[] args) { 8 | ThreadFactory factory = Executors.defaultThreadFactory(); 9 | factory.newThread(new Printer("Nice!")).start(); 10 | for (int i = 0; i < 10000; i++) { 11 | System.out.print("Good!"); 12 | } 13 | } 14 | } 15 | /* 16 | 17 | */ -------------------------------------------------------------------------------- /src/main/java/ch02Immutable/jucSample1/ReaderThread.java: -------------------------------------------------------------------------------- 1 | package ch02Immutable.jucSample1; 2 | 3 | import java.util.List; 4 | 5 | public class ReaderThread extends Thread { 6 | private final List list; 7 | 8 | public ReaderThread(List list) { 9 | super("ReaderThread"); 10 | this.list = list; 11 | } 12 | 13 | public void run() { 14 | while (true) { 15 | for (int n : list) { 16 | System.out.println(n); 17 | } 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/ch02Immutable/jucSample3/ReaderThread.java: -------------------------------------------------------------------------------- 1 | package ch02Immutable.jucSample3; 2 | 3 | import java.util.List; 4 | 5 | public class ReaderThread extends Thread { 6 | private final List list; 7 | 8 | public ReaderThread(List list) { 9 | super("ReaderThread"); 10 | this.list = list; 11 | } 12 | 13 | public void run() { 14 | while (true) { 15 | for (int n : list) { 16 | System.out.println(n); 17 | } 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/ch04Balking/sample/Main.java: -------------------------------------------------------------------------------- 1 | package ch04Balking.sample; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | Data data = new Data("data.txt", "(empty)"); 6 | new ChangerThread("ChangerThread", data).start(); 7 | new SaverThread("SaverThread", data).start(); 8 | } 9 | } 10 | /* 11 | SaverThread calls doSave, content = No.0 12 | SaverThread calls doSave, content = No.1 13 | SaverThread calls doSave, content = No.2 14 | ChangerThread calls doSave, content = No.3 15 | ... 16 | */ -------------------------------------------------------------------------------- /src/main/java/ch09Future/a9_4a/Main.java: -------------------------------------------------------------------------------- 1 | package ch09Future.a9_4a; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | try { 6 | System.out.println("main BEGIN"); 7 | Host host = new Host(); 8 | 9 | Data data = host.request(-1, 'N'); 10 | 11 | System.out.println("data = " + data.getContent()); 12 | 13 | System.out.println("main END"); 14 | } catch (Exception e) { 15 | e.printStackTrace(); 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/ch09Future/a9_4b/Main.java: -------------------------------------------------------------------------------- 1 | package ch09Future.a9_4b; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | try { 6 | System.out.println("main BEGIN"); 7 | Host host = new Host(); 8 | 9 | Data data = host.request(-1, 'N'); 10 | 11 | System.out.println("data = " + data.getContent()); 12 | 13 | System.out.println("main END"); 14 | } catch (Exception e) { 15 | e.printStackTrace(); 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/ch07ThreadPerMessage/a7_3/Host.java: -------------------------------------------------------------------------------- 1 | package ch07ThreadPerMessage.a7_3; 2 | 3 | public class Host { 4 | private final Helper helper = new Helper(); 5 | 6 | public void request(final int count, final char c) { 7 | System.out.println(" request(" + count + ", " + c + ") BEGIN"); 8 | new Thread() { 9 | public void run() { 10 | helper.handle(count, c); 11 | } 12 | }.run(); 13 | System.out.println(" request(" + count + ", " + c + ") END"); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/ch00Introduction1/qi1_6/Something.java: -------------------------------------------------------------------------------- 1 | package ch00Introduction1.qi1_6; 2 | 3 | public class Something { 4 | public static void cA() { 5 | } 6 | 7 | public static void cB() { 8 | } 9 | 10 | public static synchronized void cSyncA() { 11 | } 12 | 13 | public static synchronized void cSyncB() { 14 | } 15 | 16 | public void iA() { 17 | } 18 | 19 | public void iB() { 20 | } 21 | 22 | public synchronized void iSyncA() { 23 | } 24 | 25 | public synchronized void iSyncB() { 26 | } 27 | } -------------------------------------------------------------------------------- /src/main/java/ch07ThreadPerMessage/sample/Host.java: -------------------------------------------------------------------------------- 1 | package ch07ThreadPerMessage.sample; 2 | 3 | public class Host { 4 | private final Helper helper = new Helper(); 5 | 6 | public void request(final int count, final char c) { 7 | System.out.println(" request(" + count + ", " + c + ") BEGIN"); 8 | new Thread() { 9 | public void run() { 10 | helper.handle(count, c); 11 | } 12 | }.start(); 13 | System.out.println(" request(" + count + ", " + c + ") END"); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/ch07ThreadPerMessage/jucSample1/Host.java: -------------------------------------------------------------------------------- 1 | package ch07ThreadPerMessage.jucSample1; 2 | 3 | public class Host { 4 | private final Helper helper = new Helper(); 5 | 6 | public void request(final int count, final char c) { 7 | System.out.println(" request(" + count + ", " + c + ") BEGIN"); 8 | new Thread() { 9 | public void run() { 10 | helper.handle(count, c); 11 | } 12 | }.start(); 13 | System.out.println(" request(" + count + ", " + c + ") END"); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/ch01SingleThreadedExecution/a1_5/SecurityGate.java: -------------------------------------------------------------------------------- 1 | package ch01SingleThreadedExecution.a1_5; 2 | 3 | public class SecurityGate { 4 | private int counter = 0; 5 | 6 | public void enter() { 7 | int currentCounter = counter; 8 | Thread.yield(); 9 | counter = currentCounter + 1; 10 | } 11 | 12 | public void exit() { 13 | int currentCounter = counter; 14 | Thread.yield(); 15 | counter = currentCounter - 1; 16 | } 17 | 18 | public int getCounter() { 19 | return counter; 20 | } 21 | } -------------------------------------------------------------------------------- /src/main/java/ch99AppendixB/initializationOnDemandHolder/MySystem.java: -------------------------------------------------------------------------------- 1 | package ch99AppendixB.initializationOnDemandHolder; 2 | 3 | import java.util.Date; 4 | 5 | public class MySystem { 6 | private Date date = new Date(); 7 | 8 | private MySystem() { 9 | } 10 | 11 | public static MySystem getInstance() { 12 | return Holder.instance; 13 | } 14 | 15 | public Date getDate() { 16 | return date; 17 | } 18 | 19 | private static class Holder { 20 | public static MySystem instance = new MySystem(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/ch02Immutable/a2_2/Main.java: -------------------------------------------------------------------------------- 1 | package ch02Immutable.a2_2; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | String s = "BAT"; 6 | String t = s.replace('B', 'C'); // 将'B'替换为'C' 7 | System.out.println("s = " + s); // 执行replace后的s 8 | System.out.println("t = " + t); // replace的返回值t 9 | if (s == t) { 10 | System.out.println("s == t"); 11 | } else { 12 | System.out.println("s != t"); 13 | } 14 | } 15 | } 16 | /* 17 | s = BAT 18 | t = CAT 19 | s != t 20 | */ -------------------------------------------------------------------------------- /src/main/java/ch08WorkerThread/a8_3a/Request.java: -------------------------------------------------------------------------------- 1 | package ch08WorkerThread.a8_3a; 2 | 3 | public class Request { 4 | private final String name; 5 | private final int number; 6 | 7 | public Request(String name, int number) { 8 | this.name = name; 9 | this.number = number; 10 | } 11 | 12 | public void execute() { 13 | System.out.println(Thread.currentThread().getName() + " executes " + this); 14 | } 15 | 16 | public String toString() { 17 | return "[ Request from " + name + " No." + number + " ]"; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/ch08WorkerThread/a8_3b/Request.java: -------------------------------------------------------------------------------- 1 | package ch08WorkerThread.a8_3b; 2 | 3 | public class Request { 4 | private final String name; 5 | private final int number; 6 | 7 | public Request(String name, int number) { 8 | this.name = name; 9 | this.number = number; 10 | } 11 | 12 | public void execute() { 13 | System.out.println(Thread.currentThread().getName() + " executes " + this); 14 | } 15 | 16 | public String toString() { 17 | return "[ Request from " + name + " No." + number + " ]"; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/ch12ActiveObject/a12_2a/activeobject/AddRequest.java: -------------------------------------------------------------------------------- 1 | package ch12ActiveObject.a12_2a.activeobject; 2 | 3 | class AddRequest extends MethodRequest { 4 | private final String x; 5 | private final String y; 6 | 7 | public AddRequest(Servant servant, FutureResult future, String x, String y) { 8 | super(servant, future); 9 | this.x = x; 10 | this.y = y; 11 | } 12 | 13 | public void execute() { 14 | Result result = servant.add(x, y); 15 | future.setResult(result); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/ch08WorkerThread/a8_3a/Main.java: -------------------------------------------------------------------------------- 1 | package ch08WorkerThread.a8_3a; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | Channel channel = new Channel(5); // 工人线程的个数 6 | channel.startWorkers(); 7 | new ClientThread("Alice", channel).start(); 8 | new ClientThread("Bobby", channel).start(); 9 | new ClientThread("Chris", channel).start(); 10 | 11 | try { 12 | Thread.sleep(30000); 13 | } catch (InterruptedException e) { 14 | } 15 | System.exit(0); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/ch08WorkerThread/a8_3b/Main.java: -------------------------------------------------------------------------------- 1 | package ch08WorkerThread.a8_3b; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | Channel channel = new Channel(5); // 工人线程的个数 6 | channel.startWorkers(); 7 | new ClientThread("Alice", channel).start(); 8 | new ClientThread("Bobby", channel).start(); 9 | new ClientThread("Chris", channel).start(); 10 | 11 | try { 12 | Thread.sleep(30000); 13 | } catch (InterruptedException e) { 14 | } 15 | System.exit(0); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/ch01SingleThreadedExecution/sample2/Main.java: -------------------------------------------------------------------------------- 1 | package ch01SingleThreadedExecution.sample2; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | System.out.println("Testing Gate, hit CTRL+C to exit."); 6 | Gate gate = new Gate(); 7 | new UserThread(gate, "Alice", "Alaska").start(); 8 | new UserThread(gate, "Bobby", "Brazil").start(); 9 | new UserThread(gate, "Chris", "Canada").start(); 10 | } 11 | } 12 | /* 13 | Testing Gate, hit CTRL+C to exit. 14 | Alice BEGIN 15 | Bobby BEGIN 16 | Chris BEGIN 17 | 18 | */ -------------------------------------------------------------------------------- /src/main/java/ch12ActiveObject/sample/Main.java: -------------------------------------------------------------------------------- 1 | package ch12ActiveObject.sample; 2 | 3 | import ch12ActiveObject.sample.activeobject.ActiveObject; 4 | import ch12ActiveObject.sample.activeobject.ActiveObjectFactory; 5 | 6 | public class Main { 7 | public static void main(String[] args) { 8 | ActiveObject activeObject = ActiveObjectFactory.createActiveObject(); 9 | new MakerClientThread("Alice", activeObject).start(); 10 | new MakerClientThread("Bobby", activeObject).start(); 11 | new DisplayClientThread("Chris", activeObject).start(); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/ch99AppendixB/singleThreadedExecution/MySystem.java: -------------------------------------------------------------------------------- 1 | package ch99AppendixB.singleThreadedExecution; 2 | 3 | import java.util.Date; 4 | 5 | public class MySystem { 6 | private static MySystem instance = null; 7 | private Date date = new Date(); 8 | 9 | private MySystem() { 10 | } 11 | 12 | public static synchronized MySystem getInstance() { 13 | if (instance == null) { 14 | instance = new MySystem(); 15 | } 16 | return instance; 17 | } 18 | 19 | public Date getDate() { 20 | return date; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/ch99AppendixB/volatile2/Main.java: -------------------------------------------------------------------------------- 1 | package ch99AppendixB.volatile2; 2 | 3 | class Runner extends Thread { 4 | private volatile boolean quit = false; 5 | 6 | public void run() { 7 | while (!quit) { 8 | // ... 9 | } 10 | System.out.println("Done"); 11 | } 12 | 13 | public void shutdown() { 14 | quit = true; 15 | } 16 | } 17 | 18 | public class Main { 19 | public static void main(String[] args) { 20 | Runner runner = new Runner(); 21 | runner.start(); 22 | runner.shutdown(); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/ch06ReadWriteLock/a6_2/ReaderThread.java: -------------------------------------------------------------------------------- 1 | package ch06ReadWriteLock.a6_2; 2 | 3 | public class ReaderThread extends Thread { 4 | private final Data data; 5 | 6 | public ReaderThread(Data data) { 7 | this.data = data; 8 | } 9 | 10 | public void run() { 11 | try { 12 | while (true) { 13 | char[] readbuf = data.read(); 14 | System.out.println(Thread.currentThread().getName() + " reads " + String.valueOf(readbuf)); 15 | } 16 | } catch (InterruptedException e) { 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/ch06ReadWriteLock/q6_6/ReaderThread.java: -------------------------------------------------------------------------------- 1 | package ch06ReadWriteLock.q6_6; 2 | 3 | public class ReaderThread extends Thread { 4 | private final Data data; 5 | 6 | public ReaderThread(Data data) { 7 | this.data = data; 8 | } 9 | 10 | public void run() { 11 | try { 12 | while (true) { 13 | char[] readbuf = data.read(); 14 | System.out.println(Thread.currentThread().getName() + " reads " + String.valueOf(readbuf)); 15 | } 16 | } catch (InterruptedException e) { 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/ch07ThreadPerMessage/q7_3/Host.java: -------------------------------------------------------------------------------- 1 | package ch07ThreadPerMessage.q7_3; 2 | 3 | import ch07ThreadPerMessage.a7_2.Helper; 4 | 5 | public class Host { 6 | private final Helper helper = new Helper(); 7 | 8 | public void request(final int count, final char c) { 9 | System.out.println(" request(" + count + ", " + c + ") BEGIN"); 10 | new Thread() { 11 | public void run() { 12 | helper.handle(count, c); 13 | } 14 | }.run(); 15 | System.out.println(" request(" + count + ", " + c + ") END"); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/ch10TwoPhaseTermination/q10_5/Service.java: -------------------------------------------------------------------------------- 1 | package ch10TwoPhaseTermination.q10_5; 2 | 3 | public class Service { 4 | // 开始运行服务 5 | public static void service() { 6 | System.out.print("service"); 7 | for (int i = 0; i < 50; i++) { 8 | System.out.print("."); 9 | try { 10 | Thread.sleep(100); 11 | } catch (InterruptedException e) { 12 | } 13 | } 14 | System.out.println("done."); 15 | } 16 | 17 | // 停止服务 18 | public static void cancel() { 19 | // 未实现 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/ch99AppendixB/doubleCheckedLocking/Main.java: -------------------------------------------------------------------------------- 1 | package ch99AppendixB.doubleCheckedLocking; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | // 线程A 6 | new Thread() { 7 | public void run() { 8 | System.out.println(MySystem.getInstance().getDate()); 9 | } 10 | }.start(); 11 | 12 | // 线程B 13 | new Thread() { 14 | public void run() { 15 | System.out.println(MySystem.getInstance().getDate()); 16 | } 17 | }.start(); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/ch06ReadWriteLock/sample/ReaderThread.java: -------------------------------------------------------------------------------- 1 | package ch06ReadWriteLock.sample; 2 | 3 | public class ReaderThread extends Thread { 4 | private final Data data; 5 | 6 | public ReaderThread(Data data) { 7 | this.data = data; 8 | } 9 | 10 | public void run() { 11 | try { 12 | while (true) { 13 | char[] readbuf = data.read(); 14 | System.out.println(Thread.currentThread().getName() + " reads " + String.valueOf(readbuf)); 15 | } 16 | } catch (InterruptedException e) { 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/ch10TwoPhaseTermination/a10_4/CountupThread.java: -------------------------------------------------------------------------------- 1 | package ch10TwoPhaseTermination.a10_4; 2 | 3 | public class CountupThread extends GracefulThread { 4 | // 计数值 5 | private long counter = 0; 6 | 7 | // 操作 8 | @Override 9 | protected void doWork() throws InterruptedException { 10 | counter++; 11 | System.out.println("doWork: counter = " + counter); 12 | Thread.sleep(500); 13 | } 14 | 15 | // 终止请求 16 | @Override 17 | protected void doShutdown() { 18 | System.out.println("doShutdown: counter = " + counter); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/ch99AppendixB/singleThreadedExecution/Main.java: -------------------------------------------------------------------------------- 1 | package ch99AppendixB.singleThreadedExecution; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | // 线程A 6 | new Thread() { 7 | public void run() { 8 | System.out.println(MySystem.getInstance().getDate()); 9 | } 10 | }.start(); 11 | 12 | // 线程B 13 | new Thread() { 14 | public void run() { 15 | System.out.println(MySystem.getInstance().getDate()); 16 | } 17 | }.start(); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/ch02Immutable/jucSample2/ReaderThread.java: -------------------------------------------------------------------------------- 1 | package ch02Immutable.jucSample2; 2 | 3 | import java.util.List; 4 | 5 | public class ReaderThread extends Thread { 6 | private final List list; 7 | 8 | public ReaderThread(List list) { 9 | super("ReaderThread"); 10 | this.list = list; 11 | } 12 | 13 | public void run() { 14 | while (true) { 15 | synchronized (list) { 16 | for (int n : list) { 17 | System.out.println(n); 18 | } 19 | } 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/ch02Immutable/sample/Person.java: -------------------------------------------------------------------------------- 1 | package ch02Immutable.sample; 2 | 3 | public final class Person { 4 | private final String name; 5 | private final String address; 6 | 7 | public Person(String name, String address) { 8 | this.name = name; 9 | this.address = address; 10 | } 11 | 12 | public String getName() { 13 | return name; 14 | } 15 | 16 | public String getAddress() { 17 | return address; 18 | } 19 | 20 | public String toString() { 21 | return "[ Person: name = " + name + ", address = " + address + " ]"; 22 | } 23 | } -------------------------------------------------------------------------------- /src/main/java/ch06ReadWriteLock/jucSample/ReaderThread.java: -------------------------------------------------------------------------------- 1 | package ch06ReadWriteLock.jucSample; 2 | 3 | public class ReaderThread extends Thread { 4 | private final Data data; 5 | 6 | public ReaderThread(Data data) { 7 | this.data = data; 8 | } 9 | 10 | public void run() { 11 | try { 12 | while (true) { 13 | char[] readbuf = data.read(); 14 | System.out.println(Thread.currentThread().getName() + " reads " + String.valueOf(readbuf)); 15 | } 16 | } catch (InterruptedException e) { 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/ch12ActiveObject/a12_2a/activeobject/SchedulerThread.java: -------------------------------------------------------------------------------- 1 | package ch12ActiveObject.a12_2a.activeobject; 2 | 3 | class SchedulerThread extends Thread { 4 | private final ActivationQueue queue; 5 | 6 | public SchedulerThread(ActivationQueue queue) { 7 | this.queue = queue; 8 | } 9 | 10 | public void invoke(MethodRequest request) { 11 | queue.putRequest(request); 12 | } 13 | 14 | public void run() { 15 | while (true) { 16 | MethodRequest request = queue.takeRequest(); 17 | request.execute(); 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/ch12ActiveObject/a12_3a/activeobject/SchedulerThread.java: -------------------------------------------------------------------------------- 1 | package ch12ActiveObject.a12_3a.activeobject; 2 | 3 | class SchedulerThread extends Thread { 4 | private final ActivationQueue queue; 5 | 6 | public SchedulerThread(ActivationQueue queue) { 7 | this.queue = queue; 8 | } 9 | 10 | public void invoke(MethodRequest request) { 11 | queue.putRequest(request); 12 | } 13 | 14 | public void run() { 15 | while (true) { 16 | MethodRequest request = queue.takeRequest(); 17 | request.execute(); 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/ch12ActiveObject/sample/activeobject/SchedulerThread.java: -------------------------------------------------------------------------------- 1 | package ch12ActiveObject.sample.activeobject; 2 | 3 | class SchedulerThread extends Thread { 4 | private final ActivationQueue queue; 5 | 6 | public SchedulerThread(ActivationQueue queue) { 7 | this.queue = queue; 8 | } 9 | 10 | public void invoke(MethodRequest request) { 11 | queue.putRequest(request); 12 | } 13 | 14 | public void run() { 15 | while (true) { 16 | MethodRequest request = queue.takeRequest(); 17 | request.execute(); 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/ch99AppendixB/initializationOnDemandHolder/Main.java: -------------------------------------------------------------------------------- 1 | package ch99AppendixB.initializationOnDemandHolder; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | // 线程A 6 | new Thread() { 7 | public void run() { 8 | System.out.println(MySystem.getInstance().getDate()); 9 | } 10 | }.start(); 11 | 12 | // 线程B 13 | new Thread() { 14 | public void run() { 15 | System.out.println(MySystem.getInstance().getDate()); 16 | } 17 | }.start(); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/ch03GuardedSuspension/a3_6/RequestQueue.java: -------------------------------------------------------------------------------- 1 | package ch03GuardedSuspension.a3_6; 2 | 3 | import java.util.LinkedList; 4 | import java.util.Queue; 5 | 6 | public class RequestQueue { 7 | private final Queue queue = new LinkedList(); 8 | 9 | public synchronized Request getRequest() throws InterruptedException { 10 | while (queue.peek() == null) { 11 | wait(); 12 | } 13 | return queue.remove(); 14 | } 15 | 16 | public synchronized void putRequest(Request request) { 17 | queue.offer(request); 18 | notifyAll(); 19 | } 20 | } -------------------------------------------------------------------------------- /src/main/java/ch06ReadWriteLock/a6_2/Main.java: -------------------------------------------------------------------------------- 1 | package ch06ReadWriteLock.a6_2; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | Data data = new Data(10); 6 | new ReaderThread(data).start(); 7 | new ReaderThread(data).start(); 8 | new ReaderThread(data).start(); 9 | new ReaderThread(data).start(); 10 | new ReaderThread(data).start(); 11 | new ReaderThread(data).start(); 12 | new WriterThread(data, "ABCDEFGHIJKLMNOPQTSTUVWXYZ").start(); 13 | new WriterThread(data, "abcdefghijklmnopqrstuvwxyz").start(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/ch06ReadWriteLock/q6_6/Main.java: -------------------------------------------------------------------------------- 1 | package ch06ReadWriteLock.q6_6; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | Data data = new Data(10); 6 | new ReaderThread(data).start(); 7 | new ReaderThread(data).start(); 8 | new ReaderThread(data).start(); 9 | new ReaderThread(data).start(); 10 | new ReaderThread(data).start(); 11 | new ReaderThread(data).start(); 12 | new WriterThread(data, "ABCDEFGHIJKLMNOPQTSTUVWXYZ").start(); 13 | new WriterThread(data, "abcdefghijklmnopqrstuvwxyz").start(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/ch10TwoPhaseTermination/a10_5/ServiceThread.java: -------------------------------------------------------------------------------- 1 | package ch10TwoPhaseTermination.a10_5; 2 | 3 | public class ServiceThread extends GracefulThread { 4 | private int count = 0; 5 | 6 | // 操作中 7 | @Override 8 | protected void doWork() throws InterruptedException { 9 | System.out.print("."); 10 | Thread.sleep(100); 11 | count++; 12 | if (count >= 50) { 13 | shutdownRequest(); // 自己终止 14 | } 15 | } 16 | 17 | // 终止处理 18 | @Override 19 | protected void doShutdown() { 20 | System.out.println("done."); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/ch11ThreadSpecificStorage/a11_6/Main.java: -------------------------------------------------------------------------------- 1 | package ch11ThreadSpecificStorage.a11_6; 2 | 3 | public class Main { 4 | private static final int TASKS = 10; 5 | 6 | public static void main(String[] args) { 7 | for (int t = 0; t < TASKS; t++) { 8 | // 写日志的任务 9 | Runnable printTask = new Runnable() { 10 | public void run() { 11 | Log.println("Hello!"); 12 | Log.close(); 13 | } 14 | }; 15 | // 执行任务 16 | new Thread(printTask).start(); 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/ch06ReadWriteLock/a6_3a/Main.java: -------------------------------------------------------------------------------- 1 | package ch06ReadWriteLock.a6_3a; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | Data data = new Data(10); 6 | new ReaderThread(data).start(); 7 | new ReaderThread(data).start(); 8 | new ReaderThread(data).start(); 9 | new ReaderThread(data).start(); 10 | new ReaderThread(data).start(); 11 | new ReaderThread(data).start(); 12 | new WriterThread(data, "ABCDEFGHIJKLMNOPQTSTUVWXYZ").start(); 13 | new WriterThread(data, "abcdefghijklmnopqrstuvwxyz").start(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/ch06ReadWriteLock/a6_3b/Main.java: -------------------------------------------------------------------------------- 1 | package ch06ReadWriteLock.a6_3b; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | Data data = new Data(10); 6 | new ReaderThread(data).start(); 7 | new ReaderThread(data).start(); 8 | new ReaderThread(data).start(); 9 | new ReaderThread(data).start(); 10 | new ReaderThread(data).start(); 11 | new ReaderThread(data).start(); 12 | new WriterThread(data, "ABCDEFGHIJKLMNOPQTSTUVWXYZ").start(); 13 | new WriterThread(data, "abcdefghijklmnopqrstuvwxyz").start(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/ch06ReadWriteLock/sample/Main.java: -------------------------------------------------------------------------------- 1 | package ch06ReadWriteLock.sample; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | Data data = new Data(10); 6 | new ReaderThread(data).start(); 7 | new ReaderThread(data).start(); 8 | new ReaderThread(data).start(); 9 | new ReaderThread(data).start(); 10 | new ReaderThread(data).start(); 11 | new ReaderThread(data).start(); 12 | new WriterThread(data, "ABCDEFGHIJKLMNOPQTSTUVWXYZ").start(); 13 | new WriterThread(data, "abcdefghijklmnopqrstuvwxyz").start(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/ch09Future/a9_3b/content/Retriever.java: -------------------------------------------------------------------------------- 1 | package ch09Future.a9_3b.content; 2 | 3 | import java.util.concurrent.Callable; 4 | 5 | public class Retriever { 6 | public static Content retrieve(final String urlstr) { 7 | AsyncContentImpl future = new AsyncContentImpl( 8 | new Callable() { 9 | public SyncContentImpl call() { 10 | return new SyncContentImpl(urlstr); 11 | } 12 | } 13 | ); 14 | 15 | new Thread(future).start(); 16 | 17 | return future; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/ch06ReadWriteLock/jucSample/Main.java: -------------------------------------------------------------------------------- 1 | package ch06ReadWriteLock.jucSample; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | Data data = new Data(10); 6 | new ReaderThread(data).start(); 7 | new ReaderThread(data).start(); 8 | new ReaderThread(data).start(); 9 | new ReaderThread(data).start(); 10 | new ReaderThread(data).start(); 11 | new ReaderThread(data).start(); 12 | new WriterThread(data, "ABCDEFGHIJKLMNOPQTSTUVWXYZ").start(); 13 | new WriterThread(data, "abcdefghijklmnopqrstuvwxyz").start(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/ch05ProducerConsumer/q5_7/Host.java: -------------------------------------------------------------------------------- 1 | package ch05ProducerConsumer.q5_7; 2 | 3 | public class Host { 4 | public static void execute(int count) { 5 | for (int i = 0; i < count; i++) { 6 | doHeavyJob(); 7 | } 8 | } 9 | 10 | private static void doHeavyJob() { 11 | // 下面代码用于表示"无法取消的繁重处理"(循环处理约10秒) 12 | System.out.println("doHeavyJob BEGIN"); 13 | long start = System.currentTimeMillis(); 14 | while (start + 10000 > System.currentTimeMillis()) { 15 | // busy loop 16 | } 17 | System.out.println("doHeavyJob END"); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/ch01SingleThreadedExecution/a1_1/UserThread.java: -------------------------------------------------------------------------------- 1 | package ch01SingleThreadedExecution.a1_1; 2 | 3 | public class UserThread extends Thread { 4 | private final Gate gate; 5 | private final String myname; 6 | private final String myaddress; 7 | 8 | public UserThread(Gate gate, String myname, String myaddress) { 9 | this.gate = gate; 10 | this.myname = myname; 11 | this.myaddress = myaddress; 12 | } 13 | 14 | public void run() { 15 | System.out.println(myname + " BEGIN"); 16 | while (true) { 17 | gate.pass(myname, myaddress); 18 | } 19 | } 20 | } -------------------------------------------------------------------------------- /src/main/java/ch05ProducerConsumer/a5_5/ClearThread.java: -------------------------------------------------------------------------------- 1 | package ch05ProducerConsumer.a5_5; 2 | 3 | public class ClearThread extends Thread { 4 | private final Table table; 5 | 6 | public ClearThread(String name, Table table) { 7 | super(name); 8 | this.table = table; 9 | } 10 | 11 | public void run() { 12 | try { 13 | while (true) { 14 | Thread.sleep(1000); 15 | System.out.println("===== " + getName() + " clears ====="); 16 | table.clear(); 17 | } 18 | } catch (InterruptedException e) { 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/ch99AppendixB/volatile1/Main.java: -------------------------------------------------------------------------------- 1 | package ch99AppendixB.volatile1; 2 | 3 | class Runner extends Thread { 4 | private boolean quit = false; 5 | 6 | public void run() { 7 | while (!quit) { 8 | // ... 9 | } 10 | System.out.println("Done"); 11 | } 12 | 13 | public void shutdown() { 14 | quit = true; 15 | } 16 | } 17 | 18 | public class Main { 19 | public static void main(String[] args) { 20 | Runner runner = new Runner(); 21 | 22 | // 启动线程 23 | runner.start(); 24 | 25 | // 终止线程 26 | runner.shutdown(); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/ch01SingleThreadedExecution/sample1/UserThread.java: -------------------------------------------------------------------------------- 1 | package ch01SingleThreadedExecution.sample1; 2 | 3 | public class UserThread extends Thread { 4 | private final Gate gate; 5 | private final String myname; 6 | private final String myaddress; 7 | 8 | public UserThread(Gate gate, String myname, String myaddress) { 9 | this.gate = gate; 10 | this.myname = myname; 11 | this.myaddress = myaddress; 12 | } 13 | 14 | public void run() { 15 | System.out.println(myname + " BEGIN"); 16 | while (true) { 17 | gate.pass(myname, myaddress); 18 | } 19 | } 20 | } -------------------------------------------------------------------------------- /src/main/java/ch01SingleThreadedExecution/sample2/UserThread.java: -------------------------------------------------------------------------------- 1 | package ch01SingleThreadedExecution.sample2; 2 | 3 | public class UserThread extends Thread { 4 | private final Gate gate; 5 | private final String myname; 6 | private final String myaddress; 7 | 8 | public UserThread(Gate gate, String myname, String myaddress) { 9 | this.gate = gate; 10 | this.myname = myname; 11 | this.myaddress = myaddress; 12 | } 13 | 14 | public void run() { 15 | System.out.println(myname + " BEGIN"); 16 | while (true) { 17 | gate.pass(myname, myaddress); 18 | } 19 | } 20 | } -------------------------------------------------------------------------------- /src/main/java/ch02Immutable/a2_5a/Main.java: -------------------------------------------------------------------------------- 1 | package ch02Immutable.a2_5a; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | // 创建实例 6 | Point p1 = new Point(0, 0); 7 | Point p2 = new Point(100, 0); 8 | Line line = new Line(p1, p2); 9 | 10 | // 显示 11 | System.out.println("line = " + line); 12 | 13 | // 修改状态 14 | p1.x = 150; 15 | p2.x = 150; 16 | p2.y = 250; 17 | 18 | // 再次显示 19 | System.out.println("line = " + line); 20 | } 21 | } 22 | /* 23 | line = [ Line: (0,0)-(100,0) ] 24 | line = [ Line: (150,0)-(150,250) ] 25 | */ -------------------------------------------------------------------------------- /src/main/java/ch02Immutable/a2_5b/Main.java: -------------------------------------------------------------------------------- 1 | package ch02Immutable.a2_5b; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | // 创建实例 6 | Point p1 = new Point(0, 0); 7 | Point p2 = new Point(100, 0); 8 | Line line = new Line(p1, p2); 9 | 10 | // 显示 11 | System.out.println("line = " + line); 12 | 13 | // 修改状态 14 | p1.x = 150; 15 | p2.x = 150; 16 | p2.y = 250; 17 | 18 | // 再次显示 19 | System.out.println("line = " + line); 20 | } 21 | } 22 | /* 23 | line = [ Line: (0,0)-(100,0) ] 24 | line = [ Line: (0,0)-(100,0) ] 25 | */ -------------------------------------------------------------------------------- /src/main/java/ch05ProducerConsumer/a5_4/Main.java: -------------------------------------------------------------------------------- 1 | package ch05ProducerConsumer.a5_4; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | Table table = new Table(3); // 创建一个能放置3个蛋糕的桌子 6 | new MakerThread("MakerThread-1", table, 31415).start(); 7 | new MakerThread("MakerThread-2", table, 92653).start(); 8 | new MakerThread("MakerThread-3", table, 58979).start(); 9 | new EaterThread("EaterThread-1", table, 32384).start(); 10 | new EaterThread("EaterThread-2", table, 62643).start(); 11 | new EaterThread("EaterThread-3", table, 38327).start(); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/ch07ThreadPerMessage/jucSample2/Host.java: -------------------------------------------------------------------------------- 1 | package ch07ThreadPerMessage.jucSample2; 2 | 3 | public class Host { 4 | private final Helper helper = new Helper(); 5 | 6 | public void request(final int count, final char c) { 7 | System.out.println(" request(" + count + ", " + c + ") BEGIN"); 8 | new Thread( 9 | new Runnable() { 10 | public void run() { 11 | helper.handle(count, c); 12 | } 13 | } 14 | ).start(); 15 | System.out.println(" request(" + count + ", " + c + ") END"); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/ch12ActiveObject/a12_2a/activeobject/MakeStringRequest.java: -------------------------------------------------------------------------------- 1 | package ch12ActiveObject.a12_2a.activeobject; 2 | 3 | class MakeStringRequest extends MethodRequest { 4 | private final int count; 5 | private final char fillchar; 6 | 7 | public MakeStringRequest(Servant servant, FutureResult future, int count, char fillchar) { 8 | super(servant, future); 9 | this.count = count; 10 | this.fillchar = fillchar; 11 | } 12 | 13 | public void execute() { 14 | Result result = servant.makeString(count, fillchar); 15 | future.setResult(result); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/ch12ActiveObject/a12_3a/activeobject/Proxy.java: -------------------------------------------------------------------------------- 1 | package ch12ActiveObject.a12_3a.activeobject; 2 | 3 | class Proxy implements ActiveObject { 4 | private final SchedulerThread scheduler; 5 | private final Servant servant; 6 | 7 | public Proxy(SchedulerThread scheduler, Servant servant) { 8 | this.scheduler = scheduler; 9 | this.servant = servant; 10 | } 11 | 12 | public Result search(String word) { 13 | FutureResult future = new FutureResult(); 14 | scheduler.invoke(new SearchRequest(servant, future, word)); 15 | return future; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/ch12ActiveObject/sample/activeobject/MakeStringRequest.java: -------------------------------------------------------------------------------- 1 | package ch12ActiveObject.sample.activeobject; 2 | 3 | class MakeStringRequest extends MethodRequest { 4 | private final int count; 5 | private final char fillchar; 6 | 7 | public MakeStringRequest(Servant servant, FutureResult future, int count, char fillchar) { 8 | super(servant, future); 9 | this.count = count; 10 | this.fillchar = fillchar; 11 | } 12 | 13 | public void execute() { 14 | Result result = servant.makeString(count, fillchar); 15 | future.setResult(result); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/ch01SingleThreadedExecution/a1_7a/UserThread.java: -------------------------------------------------------------------------------- 1 | package ch01SingleThreadedExecution.a1_7a; 2 | 3 | public class UserThread extends Thread { 4 | private final Gate gate; 5 | private final String myname; 6 | private final String myaddress; 7 | 8 | public UserThread(Gate gate, String myname, String myaddress) { 9 | this.gate = gate; 10 | this.myname = myname; 11 | this.myaddress = myaddress; 12 | } 13 | 14 | public void run() { 15 | System.out.println(myname + " BEGIN"); 16 | while (true) { 17 | gate.pass(myname, myaddress); 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/ch01SingleThreadedExecution/a1_7b/UserThread.java: -------------------------------------------------------------------------------- 1 | package ch01SingleThreadedExecution.a1_7b; 2 | 3 | public class UserThread extends Thread { 4 | private final Gate gate; 5 | private final String myname; 6 | private final String myaddress; 7 | 8 | public UserThread(Gate gate, String myname, String myaddress) { 9 | this.gate = gate; 10 | this.myname = myname; 11 | this.myaddress = myaddress; 12 | } 13 | 14 | public void run() { 15 | System.out.println(myname + " BEGIN"); 16 | while (true) { 17 | gate.pass(myname, myaddress); 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/ch01SingleThreadedExecution/a1_7c/UserThread.java: -------------------------------------------------------------------------------- 1 | package ch01SingleThreadedExecution.a1_7c; 2 | 3 | public class UserThread extends Thread { 4 | private final Gate gate; 5 | private final String myname; 6 | private final String myaddress; 7 | 8 | public UserThread(Gate gate, String myname, String myaddress) { 9 | this.gate = gate; 10 | this.myname = myname; 11 | this.myaddress = myaddress; 12 | } 13 | 14 | public void run() { 15 | System.out.println(myname + " BEGIN"); 16 | while (true) { 17 | gate.pass(myname, myaddress); 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/ch11ThreadSpecificStorage/a11_3/ClientThread.java: -------------------------------------------------------------------------------- 1 | package ch11ThreadSpecificStorage.a11_3; 2 | 3 | public class ClientThread extends Thread { 4 | public ClientThread(String name) { 5 | super(name); 6 | } 7 | 8 | public void run() { 9 | System.out.println(getName() + " BEGIN"); 10 | for (int i = 0; i < 10; i++) { 11 | Log.println("i = " + i); 12 | try { 13 | Thread.sleep(100); 14 | } catch (InterruptedException e) { 15 | } 16 | } 17 | // 不再需要Log.close() 18 | System.out.println(getName() + " END"); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/ch11ThreadSpecificStorage/sample2/ClientThread.java: -------------------------------------------------------------------------------- 1 | package ch11ThreadSpecificStorage.sample2; 2 | 3 | public class ClientThread extends Thread { 4 | public ClientThread(String name) { 5 | super(name); 6 | } 7 | 8 | public void run() { 9 | System.out.println(getName() + " BEGIN"); 10 | for (int i = 0; i < 10; i++) { 11 | Log.println("i = " + i); 12 | try { 13 | Thread.sleep(100); 14 | } catch (InterruptedException e) { 15 | } 16 | } 17 | Log.close(); 18 | System.out.println(getName() + " END"); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/ch05ProducerConsumer/jucSample1/Main.java: -------------------------------------------------------------------------------- 1 | package ch05ProducerConsumer.jucSample1; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | Table table = new Table(3); // 创建一个能放置3个蛋糕的桌子 6 | new MakerThread("MakerThread-1", table, 31415).start(); 7 | new MakerThread("MakerThread-2", table, 92653).start(); 8 | new MakerThread("MakerThread-3", table, 58979).start(); 9 | new EaterThread("EaterThread-1", table, 32384).start(); 10 | new EaterThread("EaterThread-2", table, 62643).start(); 11 | new EaterThread("EaterThread-3", table, 38327).start(); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/ch05ProducerConsumer/a5_8/LazyThread.java: -------------------------------------------------------------------------------- 1 | package ch05ProducerConsumer.a5_8; 2 | 3 | public class LazyThread extends Thread { 4 | private final Table table; 5 | 6 | public LazyThread(String name, Table table) { 7 | super(name); 8 | this.table = table; 9 | } 10 | 11 | public void run() { 12 | while (true) { 13 | try { 14 | synchronized (table) { 15 | table.wait(); 16 | } 17 | System.out.println(getName() + " is notified!"); 18 | } catch (InterruptedException e) { 19 | } 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/ch07ThreadPerMessage/a7_2/Helper.java: -------------------------------------------------------------------------------- 1 | package ch07ThreadPerMessage.a7_2; 2 | 3 | public class Helper { 4 | public void handle(int count, char c) { 5 | System.out.println(" handle(" + count + ", " + c + ") BEGIN"); 6 | for (int i = 0; i < count; i++) { 7 | slowly(); 8 | System.out.print(c); 9 | } 10 | System.out.println(""); 11 | System.out.println(" handle(" + count + ", " + c + ") END"); 12 | } 13 | 14 | private void slowly() { 15 | try { 16 | Thread.sleep(100); 17 | } catch (InterruptedException e) { 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/ch07ThreadPerMessage/a7_3/Helper.java: -------------------------------------------------------------------------------- 1 | package ch07ThreadPerMessage.a7_3; 2 | 3 | public class Helper { 4 | public void handle(int count, char c) { 5 | System.out.println(" handle(" + count + ", " + c + ") BEGIN"); 6 | for (int i = 0; i < count; i++) { 7 | slowly(); 8 | System.out.print(c); 9 | } 10 | System.out.println(""); 11 | System.out.println(" handle(" + count + ", " + c + ") END"); 12 | } 13 | 14 | private void slowly() { 15 | try { 16 | Thread.sleep(100); 17 | } catch (InterruptedException e) { 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/ch07ThreadPerMessage/a7_4a/Helper.java: -------------------------------------------------------------------------------- 1 | package ch07ThreadPerMessage.a7_4a; 2 | 3 | public class Helper { 4 | public void handle(int count, char c) { 5 | System.out.println(" handle(" + count + ", " + c + ") BEGIN"); 6 | for (int i = 0; i < count; i++) { 7 | slowly(); 8 | System.out.print(c); 9 | } 10 | System.out.println(""); 11 | System.out.println(" handle(" + count + ", " + c + ") END"); 12 | } 13 | 14 | private void slowly() { 15 | try { 16 | Thread.sleep(100); 17 | } catch (InterruptedException e) { 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/ch07ThreadPerMessage/sample/Helper.java: -------------------------------------------------------------------------------- 1 | package ch07ThreadPerMessage.sample; 2 | 3 | public class Helper { 4 | public void handle(int count, char c) { 5 | System.out.println(" handle(" + count + ", " + c + ") BEGIN"); 6 | for (int i = 0; i < count; i++) { 7 | slowly(); 8 | System.out.print(c); 9 | } 10 | System.out.println(""); 11 | System.out.println(" handle(" + count + ", " + c + ") END"); 12 | } 13 | 14 | private void slowly() { 15 | try { 16 | Thread.sleep(100); 17 | } catch (InterruptedException e) { 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/ch07ThreadPerMessage/jucSample1/Helper.java: -------------------------------------------------------------------------------- 1 | package ch07ThreadPerMessage.jucSample1; 2 | 3 | public class Helper { 4 | public void handle(int count, char c) { 5 | System.out.println(" handle(" + count + ", " + c + ") BEGIN"); 6 | for (int i = 0; i < count; i++) { 7 | slowly(); 8 | System.out.print(c); 9 | } 10 | System.out.println(""); 11 | System.out.println(" handle(" + count + ", " + c + ") END"); 12 | } 13 | 14 | private void slowly() { 15 | try { 16 | Thread.sleep(100); 17 | } catch (InterruptedException e) { 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/ch07ThreadPerMessage/jucSample2/Helper.java: -------------------------------------------------------------------------------- 1 | package ch07ThreadPerMessage.jucSample2; 2 | 3 | public class Helper { 4 | public void handle(int count, char c) { 5 | System.out.println(" handle(" + count + ", " + c + ") BEGIN"); 6 | for (int i = 0; i < count; i++) { 7 | slowly(); 8 | System.out.print(c); 9 | } 10 | System.out.println(""); 11 | System.out.println(" handle(" + count + ", " + c + ") END"); 12 | } 13 | 14 | private void slowly() { 15 | try { 16 | Thread.sleep(100); 17 | } catch (InterruptedException e) { 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/ch07ThreadPerMessage/jucSample3/Helper.java: -------------------------------------------------------------------------------- 1 | package ch07ThreadPerMessage.jucSample3; 2 | 3 | public class Helper { 4 | public void handle(int count, char c) { 5 | System.out.println(" handle(" + count + ", " + c + ") BEGIN"); 6 | for (int i = 0; i < count; i++) { 7 | slowly(); 8 | System.out.print(c); 9 | } 10 | System.out.println(""); 11 | System.out.println(" handle(" + count + ", " + c + ") END"); 12 | } 13 | 14 | private void slowly() { 15 | try { 16 | Thread.sleep(100); 17 | } catch (InterruptedException e) { 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/ch07ThreadPerMessage/jucSample4/Helper.java: -------------------------------------------------------------------------------- 1 | package ch07ThreadPerMessage.jucSample4; 2 | 3 | public class Helper { 4 | public void handle(int count, char c) { 5 | System.out.println(" handle(" + count + ", " + c + ") BEGIN"); 6 | for (int i = 0; i < count; i++) { 7 | slowly(); 8 | System.out.print(c); 9 | } 10 | System.out.println(""); 11 | System.out.println(" handle(" + count + ", " + c + ") END"); 12 | } 13 | 14 | private void slowly() { 15 | try { 16 | Thread.sleep(100); 17 | } catch (InterruptedException e) { 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/ch07ThreadPerMessage/jucSample5/Helper.java: -------------------------------------------------------------------------------- 1 | package ch07ThreadPerMessage.jucSample5; 2 | 3 | public class Helper { 4 | public void handle(int count, char c) { 5 | System.out.println(" handle(" + count + ", " + c + ") BEGIN"); 6 | for (int i = 0; i < count; i++) { 7 | slowly(); 8 | System.out.print(c); 9 | } 10 | System.out.println(""); 11 | System.out.println(" handle(" + count + ", " + c + ") END"); 12 | } 13 | 14 | private void slowly() { 15 | try { 16 | Thread.sleep(100); 17 | } catch (InterruptedException e) { 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/ch07ThreadPerMessage/jucSample5/Main.java: -------------------------------------------------------------------------------- 1 | package ch07ThreadPerMessage.jucSample5; 2 | 3 | import java.util.concurrent.Executor; 4 | 5 | public class Main { 6 | public static void main(String[] args) { 7 | System.out.println("main BEGIN"); 8 | Host host = new Host( 9 | new Executor() { 10 | public void execute(Runnable r) { 11 | new Thread(r).start(); 12 | } 13 | } 14 | ); 15 | host.request(10, 'A'); 16 | host.request(20, 'B'); 17 | host.request(30, 'C'); 18 | System.out.println("main END"); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/ch07ThreadPerMessage/jucSample6/Helper.java: -------------------------------------------------------------------------------- 1 | package ch07ThreadPerMessage.jucSample6; 2 | 3 | public class Helper { 4 | public void handle(int count, char c) { 5 | System.out.println(" handle(" + count + ", " + c + ") BEGIN"); 6 | for (int i = 0; i < count; i++) { 7 | slowly(); 8 | System.out.print(c); 9 | } 10 | System.out.println(""); 11 | System.out.println(" handle(" + count + ", " + c + ") END"); 12 | } 13 | 14 | private void slowly() { 15 | try { 16 | Thread.sleep(100); 17 | } catch (InterruptedException e) { 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/ch07ThreadPerMessage/jucSample7/Helper.java: -------------------------------------------------------------------------------- 1 | package ch07ThreadPerMessage.jucSample7; 2 | 3 | public class Helper { 4 | public void handle(int count, char c) { 5 | System.out.println(" handle(" + count + ", " + c + ") BEGIN"); 6 | for (int i = 0; i < count; i++) { 7 | slowly(); 8 | System.out.print(c); 9 | } 10 | System.out.println(""); 11 | System.out.println(" handle(" + count + ", " + c + ") END"); 12 | } 13 | 14 | private void slowly() { 15 | try { 16 | Thread.sleep(100); 17 | } catch (InterruptedException e) { 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/ch12ActiveObject/a12_3a/activeobject/Servant.java: -------------------------------------------------------------------------------- 1 | package ch12ActiveObject.a12_3a.activeobject; 2 | 3 | public class Servant implements ActiveObject { 4 | public Result search(String word) { 5 | System.out.print("search(" + word + ")"); 6 | for (int i = 0; i < 50; i++) { 7 | System.out.print("."); 8 | try { 9 | Thread.sleep(100); 10 | } catch (InterruptedException e) { 11 | } 12 | } 13 | System.out.println("found."); 14 | String url = "http://somewhere/" + word + ".html"; // dummy URL 15 | return new RealResult(url); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/ch07ThreadPerMessage/a7_5a/Service.java: -------------------------------------------------------------------------------- 1 | package ch07ThreadPerMessage.a7_5a; 2 | 3 | public class Service { 4 | public static void service() { 5 | new Thread() { 6 | public void run() { 7 | doService(); 8 | } 9 | }.start(); 10 | } 11 | 12 | private static void doService() { 13 | System.out.print("service"); 14 | for (int i = 0; i < 50; i++) { 15 | System.out.print("."); 16 | try { 17 | Thread.sleep(100); 18 | } catch (InterruptedException e) { 19 | } 20 | } 21 | System.out.println("done."); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/ch03GuardedSuspension/a3_5/RequestQueue.java: -------------------------------------------------------------------------------- 1 | package ch03GuardedSuspension.a3_5; 2 | 3 | import java.util.LinkedList; 4 | import java.util.Queue; 5 | 6 | public class RequestQueue { 7 | private final Queue queue = new LinkedList(); 8 | 9 | public synchronized Request getRequest() { 10 | while (queue.peek() == null) { 11 | try { 12 | wait(); 13 | } catch (InterruptedException e) { 14 | } 15 | } 16 | return queue.remove(); 17 | } 18 | 19 | public synchronized void putRequest(Request request) { 20 | queue.offer(request); 21 | notifyAll(); 22 | } 23 | } -------------------------------------------------------------------------------- /src/main/java/ch03GuardedSuspension/q3_5/RequestQueue.java: -------------------------------------------------------------------------------- 1 | package ch03GuardedSuspension.q3_5; 2 | 3 | import java.util.LinkedList; 4 | import java.util.Queue; 5 | 6 | public class RequestQueue { 7 | private final Queue queue = new LinkedList(); 8 | 9 | public synchronized Request getRequest() { 10 | while (queue.peek() == null) { 11 | try { 12 | wait(); 13 | } catch (InterruptedException e) { 14 | } 15 | } 16 | return queue.remove(); 17 | } 18 | 19 | public synchronized void putRequest(Request request) { 20 | queue.offer(request); 21 | notifyAll(); 22 | } 23 | } -------------------------------------------------------------------------------- /src/main/java/ch03GuardedSuspension/q3_6/RequestQueue.java: -------------------------------------------------------------------------------- 1 | package ch03GuardedSuspension.q3_6; 2 | 3 | import java.util.LinkedList; 4 | import java.util.Queue; 5 | 6 | public class RequestQueue { 7 | private final Queue queue = new LinkedList(); 8 | 9 | public synchronized Request getRequest() { 10 | while (queue.peek() == null) { 11 | try { 12 | wait(); 13 | } catch (InterruptedException e) { 14 | } 15 | } 16 | return queue.remove(); 17 | } 18 | 19 | public synchronized void putRequest(Request request) { 20 | queue.offer(request); 21 | notifyAll(); 22 | } 23 | } -------------------------------------------------------------------------------- /src/main/java/ch07ThreadPerMessage/jucSample3/Main.java: -------------------------------------------------------------------------------- 1 | package ch07ThreadPerMessage.jucSample3; 2 | 3 | import java.util.concurrent.ThreadFactory; 4 | 5 | public class Main { 6 | public static void main(String[] args) { 7 | System.out.println("main BEGIN"); 8 | Host host = new Host( 9 | new ThreadFactory() { 10 | public Thread newThread(Runnable r) { 11 | return new Thread(r); 12 | } 13 | } 14 | ); 15 | host.request(10, 'A'); 16 | host.request(20, 'B'); 17 | host.request(30, 'C'); 18 | System.out.println("main END"); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/ch12ActiveObject/a12_2a/activeobject/FutureResult.java: -------------------------------------------------------------------------------- 1 | package ch12ActiveObject.a12_2a.activeobject; 2 | 3 | class FutureResult extends Result { 4 | private Result result; 5 | private boolean ready = false; 6 | 7 | public synchronized void setResult(Result result) { 8 | this.result = result; 9 | this.ready = true; 10 | notifyAll(); 11 | } 12 | 13 | public synchronized T getResultValue() { 14 | while (!ready) { 15 | try { 16 | wait(); 17 | } catch (InterruptedException e) { 18 | } 19 | } 20 | return result.getResultValue(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/ch12ActiveObject/a12_3a/activeobject/FutureResult.java: -------------------------------------------------------------------------------- 1 | package ch12ActiveObject.a12_3a.activeobject; 2 | 3 | class FutureResult extends Result { 4 | private Result result; 5 | private boolean ready = false; 6 | 7 | public synchronized void setResult(Result result) { 8 | this.result = result; 9 | this.ready = true; 10 | notifyAll(); 11 | } 12 | 13 | public synchronized T getResultValue() { 14 | while (!ready) { 15 | try { 16 | wait(); 17 | } catch (InterruptedException e) { 18 | } 19 | } 20 | return result.getResultValue(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/ch12ActiveObject/sample/activeobject/FutureResult.java: -------------------------------------------------------------------------------- 1 | package ch12ActiveObject.sample.activeobject; 2 | 3 | class FutureResult extends Result { 4 | private Result result; 5 | private boolean ready = false; 6 | 7 | public synchronized void setResult(Result result) { 8 | this.result = result; 9 | this.ready = true; 10 | notifyAll(); 11 | } 12 | 13 | public synchronized T getResultValue() { 14 | while (!ready) { 15 | try { 16 | wait(); 17 | } catch (InterruptedException e) { 18 | } 19 | } 20 | return result.getResultValue(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/ch02Immutable/jucSample1/Main.java: -------------------------------------------------------------------------------- 1 | package ch02Immutable.jucSample1; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | public class Main { 7 | public static void main(String[] args) { 8 | List list = new ArrayList(); 9 | new WriterThread(list).start(); 10 | new ReaderThread(list).start(); 11 | } 12 | } 13 | /* 14 | Exception in thread "ReaderThread" java.util.ConcurrentModificationException 15 | at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901) 16 | at java.util.ArrayList$Itr.next(ArrayList.java:851) 17 | at ch02Immutable.jucSample1.ReaderThread.run(ReaderThread.java:15) 18 | 5175 19 | */ -------------------------------------------------------------------------------- /src/main/java/ch03GuardedSuspension/sample/RequestQueue.java: -------------------------------------------------------------------------------- 1 | package ch03GuardedSuspension.sample; 2 | 3 | import java.util.LinkedList; 4 | import java.util.Queue; 5 | 6 | public class RequestQueue { 7 | private final Queue queue = new LinkedList(); 8 | 9 | public synchronized Request getRequest() { 10 | while (queue.peek() == null) { 11 | try { 12 | wait(); 13 | } catch (InterruptedException e) { 14 | } 15 | } 16 | return queue.remove(); 17 | } 18 | 19 | public synchronized void putRequest(Request request) { 20 | queue.offer(request); 21 | notifyAll(); 22 | } 23 | } -------------------------------------------------------------------------------- /src/main/java/ch07ThreadPerMessage/a7_5b/Service.java: -------------------------------------------------------------------------------- 1 | package ch07ThreadPerMessage.a7_5b; 2 | 3 | public class Service { 4 | public static void service() { 5 | new Thread() { 6 | public void run() { 7 | doService(); 8 | } 9 | }.start(); 10 | } 11 | 12 | private static synchronized void doService() { 13 | System.out.print("service"); 14 | for (int i = 0; i < 50; i++) { 15 | System.out.print("."); 16 | try { 17 | Thread.sleep(100); 18 | } catch (InterruptedException e) { 19 | } 20 | } 21 | System.out.println("done."); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/ch09Future/a9_3a/content/AsyncContentImpl.java: -------------------------------------------------------------------------------- 1 | package ch09Future.a9_3a.content; 2 | 3 | class AsyncContentImpl implements Content { 4 | private SyncContentImpl synccontent; 5 | private boolean ready = false; 6 | 7 | public synchronized void setContent(SyncContentImpl synccontent) { 8 | this.synccontent = synccontent; 9 | this.ready = true; 10 | notifyAll(); 11 | } 12 | 13 | public synchronized byte[] getBytes() { 14 | while (!ready) { 15 | try { 16 | wait(); 17 | } catch (InterruptedException e) { 18 | } 19 | } 20 | return synccontent.getBytes(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/ch09Future/a9_4b/FutureData.java: -------------------------------------------------------------------------------- 1 | package ch09Future.a9_4b; 2 | 3 | import java.util.concurrent.Callable; 4 | import java.util.concurrent.ExecutionException; 5 | import java.util.concurrent.FutureTask; 6 | 7 | public class FutureData extends FutureTask implements Data { 8 | public FutureData(Callable callable) { 9 | super(callable); 10 | } 11 | 12 | public String getContent() throws ExecutionException { 13 | String string = null; 14 | try { 15 | string = get().getContent(); 16 | } catch (InterruptedException e) { 17 | e.printStackTrace(); 18 | } 19 | return string; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/ch11ThreadSpecificStorage/q11_4/ClientThread.java: -------------------------------------------------------------------------------- 1 | package ch11ThreadSpecificStorage.q11_4; 2 | 3 | public class ClientThread extends Thread { 4 | public ClientThread(String name) { 5 | super(name); 6 | Log.println("constructor is called."); 7 | } 8 | 9 | public void run() { 10 | System.out.println(getName() + " BEGIN"); 11 | for (int i = 0; i < 10; i++) { 12 | Log.println("i = " + i); 13 | try { 14 | Thread.sleep(100); 15 | } catch (InterruptedException e) { 16 | } 17 | } 18 | Log.close(); 19 | System.out.println(getName() + " END"); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/ch12ActiveObject/a12_2b/Main.java: -------------------------------------------------------------------------------- 1 | package ch12ActiveObject.a12_2b; 2 | 3 | import ch12ActiveObject.a12_2b.activeobject.ActiveObject; 4 | import ch12ActiveObject.a12_2b.activeobject.ActiveObjectFactory; 5 | 6 | public class Main { 7 | public static void main(String[] args) { 8 | ActiveObject activeObject = ActiveObjectFactory.createActiveObject(); 9 | try { 10 | new AddClientThread("Diana", activeObject).start(); 11 | Thread.sleep(5000); 12 | } catch (InterruptedException e) { 13 | } finally { 14 | System.out.println("*** shutdown ***"); 15 | activeObject.shutdown(); 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/ch12ActiveObject/q12_2b/Main.java: -------------------------------------------------------------------------------- 1 | package ch12ActiveObject.q12_2b; 2 | 3 | import ch12ActiveObject.a12_2b.activeobject.ActiveObject; 4 | import ch12ActiveObject.a12_2b.activeobject.ActiveObjectFactory; 5 | 6 | public class Main { 7 | public static void main(String[] args) { 8 | ActiveObject activeObject = ActiveObjectFactory.createActiveObject(); 9 | try { 10 | new AddClientThread("Diana", activeObject).start(); 11 | Thread.sleep(5000); 12 | } catch (InterruptedException e) { 13 | } finally { 14 | System.out.println("*** shutdown ***"); 15 | activeObject.shutdown(); 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/ch05ProducerConsumer/a5_5/Main.java: -------------------------------------------------------------------------------- 1 | package ch05ProducerConsumer.a5_5; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | Table table = new Table(3); // 创建一个能放置3个蛋糕的桌子 6 | new MakerThread("MakerThread-1", table, 31415).start(); 7 | new MakerThread("MakerThread-2", table, 92653).start(); 8 | new MakerThread("MakerThread-3", table, 58979).start(); 9 | new EaterThread("EaterThread-1", table, 32384).start(); 10 | new EaterThread("EaterThread-2", table, 62643).start(); 11 | new EaterThread("EaterThread-3", table, 38327).start(); 12 | new ClearThread("ClearThread-0", table).start(); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/ch02Immutable/a2_4/Main.java: -------------------------------------------------------------------------------- 1 | package ch02Immutable.a2_4; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | // 创建实例 6 | UserInfo userinfo = new UserInfo("Alice", "Alaska"); 7 | 8 | // 显示 9 | System.out.println("userinfo = " + userinfo); 10 | 11 | // 修改状态 12 | StringBuffer info = userinfo.getInfo(); 13 | info.replace(12, 17, "Bobby"); // 12到17是字符串"Alice"的位置 14 | 15 | // 再次显示 16 | System.out.println("userinfo = " + userinfo); 17 | } 18 | } 19 | /* 20 | userinfo = [ UserInfo: ] 21 | userinfo = [ UserInfo: ] 22 | */ -------------------------------------------------------------------------------- /src/main/java/ch05ProducerConsumer/sample/EaterThread.java: -------------------------------------------------------------------------------- 1 | package ch05ProducerConsumer.sample; 2 | 3 | import java.util.Random; 4 | 5 | public class EaterThread extends Thread { 6 | private final Random random; 7 | private final Table table; 8 | 9 | public EaterThread(String name, Table table, long seed) { 10 | super(name); 11 | this.table = table; 12 | this.random = new Random(seed); 13 | } 14 | 15 | public void run() { 16 | try { 17 | while (true) { 18 | String cake = table.take(); 19 | Thread.sleep(random.nextInt(1000)); 20 | } 21 | } catch (InterruptedException e) { 22 | } 23 | } 24 | } -------------------------------------------------------------------------------- /src/main/java/ch04Balking/a4_2a/SaverThread.java: -------------------------------------------------------------------------------- 1 | package ch04Balking.a4_2a; 2 | 3 | import java.io.IOException; 4 | 5 | public class SaverThread extends Thread { 6 | private final Data data; 7 | 8 | public SaverThread(String name, Data data) { 9 | super(name); 10 | this.data = data; 11 | } 12 | 13 | public void run() { 14 | try { 15 | while (true) { 16 | data.save(); // 要求保存数据 17 | Thread.sleep(1000); // 休眠约1秒 18 | } 19 | } catch (IOException e) { 20 | e.printStackTrace(); 21 | } catch (InterruptedException e) { 22 | e.printStackTrace(); 23 | } 24 | } 25 | } -------------------------------------------------------------------------------- /src/main/java/ch04Balking/sample/SaverThread.java: -------------------------------------------------------------------------------- 1 | package ch04Balking.sample; 2 | 3 | import java.io.IOException; 4 | 5 | public class SaverThread extends Thread { 6 | private final Data data; 7 | 8 | public SaverThread(String name, Data data) { 9 | super(name); 10 | this.data = data; 11 | } 12 | 13 | public void run() { 14 | try { 15 | while (true) { 16 | data.save(); // 要求保存数据 17 | Thread.sleep(1000); // 休眠约1秒 18 | } 19 | } catch (IOException e) { 20 | e.printStackTrace(); 21 | } catch (InterruptedException e) { 22 | e.printStackTrace(); 23 | } 24 | } 25 | } -------------------------------------------------------------------------------- /src/main/java/ch05ProducerConsumer/a5_4/EaterThread.java: -------------------------------------------------------------------------------- 1 | package ch05ProducerConsumer.a5_4; 2 | 3 | import java.util.Random; 4 | 5 | public class EaterThread extends Thread { 6 | private final Random random; 7 | private final Table table; 8 | 9 | public EaterThread(String name, Table table, long seed) { 10 | super(name); 11 | this.table = table; 12 | this.random = new Random(seed); 13 | } 14 | 15 | public void run() { 16 | try { 17 | while (true) { 18 | String cake = table.take(); 19 | Thread.sleep(random.nextInt(1000)); 20 | } 21 | } catch (InterruptedException e) { 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/ch05ProducerConsumer/a5_5/EaterThread.java: -------------------------------------------------------------------------------- 1 | package ch05ProducerConsumer.a5_5; 2 | 3 | import java.util.Random; 4 | 5 | public class EaterThread extends Thread { 6 | private final Random random; 7 | private final Table table; 8 | 9 | public EaterThread(String name, Table table, long seed) { 10 | super(name); 11 | this.table = table; 12 | this.random = new Random(seed); 13 | } 14 | 15 | public void run() { 16 | try { 17 | while (true) { 18 | String cake = table.take(); 19 | Thread.sleep(random.nextInt(1000)); 20 | } 21 | } catch (InterruptedException e) { 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/ch05ProducerConsumer/a5_6/EaterThread.java: -------------------------------------------------------------------------------- 1 | package ch05ProducerConsumer.a5_6; 2 | 3 | import java.util.Random; 4 | 5 | public class EaterThread extends Thread { 6 | private final Random random; 7 | private final Table table; 8 | 9 | public EaterThread(String name, Table table, long seed) { 10 | super(name); 11 | this.table = table; 12 | this.random = new Random(seed); 13 | } 14 | 15 | public void run() { 16 | try { 17 | while (true) { 18 | String cake = table.take(); 19 | Thread.sleep(random.nextInt(1000)); 20 | } 21 | } catch (InterruptedException e) { 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/ch05ProducerConsumer/a5_8/EaterThread.java: -------------------------------------------------------------------------------- 1 | package ch05ProducerConsumer.a5_8; 2 | 3 | import java.util.Random; 4 | 5 | public class EaterThread extends Thread { 6 | private final Random random; 7 | private final Table table; 8 | 9 | public EaterThread(String name, Table table, long seed) { 10 | super(name); 11 | this.table = table; 12 | this.random = new Random(seed); 13 | } 14 | 15 | public void run() { 16 | try { 17 | while (true) { 18 | String cake = table.take(); 19 | Thread.sleep(random.nextInt(1000)); 20 | } 21 | } catch (InterruptedException e) { 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/ch05ProducerConsumer/jucSample1/Table.java: -------------------------------------------------------------------------------- 1 | package ch05ProducerConsumer.jucSample1; 2 | 3 | import java.util.concurrent.ArrayBlockingQueue; 4 | 5 | public class Table extends ArrayBlockingQueue { 6 | public Table(int count) { 7 | super(count); 8 | } 9 | 10 | public void put(String cake) throws InterruptedException { 11 | System.out.println(Thread.currentThread().getName() + " puts " + cake); 12 | super.put(cake); 13 | } 14 | 15 | public String take() throws InterruptedException { 16 | String cake = super.take(); 17 | System.out.println(Thread.currentThread().getName() + " takes " + cake); 18 | return cake; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/ch05ProducerConsumer/q5_2/EaterThread.java: -------------------------------------------------------------------------------- 1 | package ch05ProducerConsumer.q5_2; 2 | 3 | import java.util.Random; 4 | 5 | public class EaterThread extends Thread { 6 | private final Random random; 7 | private final Table table; 8 | 9 | public EaterThread(String name, Table table, long seed) { 10 | super(name); 11 | this.table = table; 12 | this.random = new Random(seed); 13 | } 14 | 15 | public void run() { 16 | try { 17 | while (true) { 18 | String cake = table.take(); 19 | Thread.sleep(random.nextInt(1000)); 20 | } 21 | } catch (InterruptedException e) { 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/ch04Balking/a4_2b/SaverThread.java: -------------------------------------------------------------------------------- 1 | package ch04Balking.a4_2b; 2 | 3 | import java.io.IOException; 4 | 5 | public class SaverThread extends Thread { 6 | private final Data data; 7 | 8 | public SaverThread(String name, Data data) { 9 | super(name); 10 | this.data = data; 11 | } 12 | 13 | public void run() { 14 | try { 15 | while (true) { 16 | data.save(); // 要求保存数据 17 | Thread.sleep(1000); // 休眠约1秒 18 | } 19 | } catch (IOException e) { 20 | e.printStackTrace(); 21 | } catch (InterruptedException e) { 22 | e.printStackTrace(); 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/ch04Balking/q4_4a/RequestQueue.java: -------------------------------------------------------------------------------- 1 | package ch04Balking.q4_4a; 2 | 3 | import ch04Balking.a4_4a.Request; 4 | 5 | import java.util.LinkedList; 6 | import java.util.Queue; 7 | 8 | public class RequestQueue { 9 | private final Queue queue = new LinkedList(); 10 | 11 | public synchronized Request getRequest() { 12 | while (queue.peek() == null) { 13 | try { 14 | wait(); 15 | } catch (InterruptedException e) { 16 | } 17 | } 18 | return queue.remove(); 19 | } 20 | 21 | public synchronized void putRequest(Request request) { 22 | queue.offer(request); 23 | notifyAll(); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/ch05ProducerConsumer/jucSample1/EaterThread.java: -------------------------------------------------------------------------------- 1 | package ch05ProducerConsumer.jucSample1; 2 | 3 | import java.util.Random; 4 | 5 | public class EaterThread extends Thread { 6 | private final Random random; 7 | private final Table table; 8 | 9 | public EaterThread(String name, Table table, long seed) { 10 | super(name); 11 | this.table = table; 12 | this.random = new Random(seed); 13 | } 14 | 15 | public void run() { 16 | try { 17 | while (true) { 18 | String cake = table.take(); 19 | Thread.sleep(random.nextInt(1000)); 20 | } 21 | } catch (InterruptedException e) { 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/ch00Introduction1/sync/Bank.java: -------------------------------------------------------------------------------- 1 | package ch00Introduction1.sync; 2 | 3 | public class Bank { 4 | private int money; 5 | private String name; 6 | 7 | public Bank(String name, int money) { 8 | this.name = name; 9 | this.money = money; 10 | } 11 | 12 | // 存款 13 | public synchronized void deposit(int m) { 14 | money += m; 15 | } 16 | 17 | // 取款 18 | public synchronized boolean withdraw(int m) { 19 | if (money >= m) { 20 | money -= m; 21 | return true; // 取款成功 22 | } else { 23 | return false; // 余额不足 24 | } 25 | } 26 | 27 | public String getName() { 28 | return name; 29 | } 30 | } -------------------------------------------------------------------------------- /src/main/java/ch09Future/q9_4/FutureData.java: -------------------------------------------------------------------------------- 1 | package ch09Future.q9_4; 2 | 3 | public class FutureData implements Data { 4 | private RealData realdata = null; 5 | private boolean ready = false; 6 | 7 | public synchronized void setRealData(RealData realdata) { 8 | if (ready) { 9 | return; // balk 10 | } 11 | this.realdata = realdata; 12 | this.ready = true; 13 | notifyAll(); 14 | } 15 | 16 | public synchronized String getContent() { 17 | while (!ready) { 18 | try { 19 | wait(); 20 | } catch (InterruptedException e) { 21 | } 22 | } 23 | return realdata.getContent(); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/ch09Future/sample/FutureData.java: -------------------------------------------------------------------------------- 1 | package ch09Future.sample; 2 | 3 | public class FutureData implements Data { 4 | private RealData realdata = null; 5 | private boolean ready = false; 6 | 7 | public synchronized void setRealData(RealData realdata) { 8 | if (ready) { 9 | return; // balk 10 | } 11 | this.realdata = realdata; 12 | this.ready = true; 13 | notifyAll(); 14 | } 15 | 16 | public synchronized String getContent() { 17 | while (!ready) { 18 | try { 19 | wait(); 20 | } catch (InterruptedException e) { 21 | } 22 | } 23 | return realdata.getContent(); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/ch03GuardedSuspension/jucSample/RequestQueue.java: -------------------------------------------------------------------------------- 1 | package ch03GuardedSuspension.jucSample; 2 | 3 | import java.util.concurrent.BlockingQueue; 4 | import java.util.concurrent.LinkedBlockingQueue; 5 | 6 | public class RequestQueue { 7 | private final BlockingQueue queue = new LinkedBlockingQueue(); 8 | 9 | public Request getRequest() { 10 | Request req = null; 11 | try { 12 | req = queue.take(); 13 | } catch (InterruptedException e) { 14 | } 15 | return req; 16 | } 17 | 18 | public void putRequest(Request request) { 19 | try { 20 | queue.put(request); 21 | } catch (InterruptedException e) { 22 | } 23 | } 24 | } -------------------------------------------------------------------------------- /src/main/java/ch01SingleThreadedExecution/sample1/Gate.java: -------------------------------------------------------------------------------- 1 | package ch01SingleThreadedExecution.sample1; 2 | 3 | public class Gate { 4 | private int counter = 0; 5 | private String name = "Nobody"; 6 | private String address = "Nowhere"; 7 | 8 | public void pass(String name, String address) { 9 | this.counter++; 10 | this.name = name; 11 | this.address = address; 12 | check(); 13 | } 14 | 15 | public String toString() { 16 | return "No." + counter + ": " + name + ", " + address; 17 | } 18 | 19 | private void check() { 20 | if (name.charAt(0) != address.charAt(0)) { 21 | System.out.println("***** BROKEN ***** " + toString()); 22 | } 23 | } 24 | } -------------------------------------------------------------------------------- /src/main/java/ch09Future/q9_4/Host.java: -------------------------------------------------------------------------------- 1 | package ch09Future.q9_4; 2 | 3 | public class Host { 4 | public Data request(final int count, final char c) { 5 | System.out.println(" request(" + count + ", " + c + ") BEGIN"); 6 | 7 | // (1) 创建FutureData的实例 8 | final FutureData future = new FutureData(); 9 | 10 | // (2) 启动一个新线程,用于创建RealData的实例 11 | new Thread() { 12 | public void run() { 13 | RealData realdata = new RealData(count, c); 14 | future.setRealData(realdata); 15 | } 16 | }.start(); 17 | 18 | System.out.println(" request(" + count + ", " + c + ") END"); 19 | 20 | // (3) 返回FutureData的实例 21 | return future; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/ch04Balking/q4_4b/RequestQueue.java: -------------------------------------------------------------------------------- 1 | package ch04Balking.q4_4b; 2 | 3 | import ch04Balking.a4_4b.Request; 4 | 5 | import java.util.concurrent.BlockingQueue; 6 | import java.util.concurrent.LinkedBlockingQueue; 7 | 8 | public class RequestQueue { 9 | private final BlockingQueue queue = new LinkedBlockingQueue(); 10 | 11 | public Request getRequest() { 12 | Request req = null; 13 | try { 14 | req = queue.take(); 15 | } catch (InterruptedException e) { 16 | } 17 | return req; 18 | } 19 | 20 | public void putRequest(Request request) { 21 | try { 22 | queue.put(request); 23 | } catch (InterruptedException e) { 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/ch04Balking/timeout/Main.java: -------------------------------------------------------------------------------- 1 | package ch04Balking.timeout; 2 | 3 | import java.util.concurrent.TimeoutException; 4 | 5 | public class Main { 6 | public static void main(String[] args) { 7 | Host host = new Host(10000); 8 | try { 9 | System.out.println("execute BEGIN"); 10 | host.execute(); 11 | } catch (TimeoutException e) { 12 | e.printStackTrace(); 13 | } catch (InterruptedException e) { 14 | e.printStackTrace(); 15 | } 16 | } 17 | } 18 | /* 19 | execute BEGIN 20 | java.util.concurrent.TimeoutException: now - start = 10000, timeout = 10000 21 | at ch04Balking.timeout.Host.execute(Host.java:26) 22 | at ch04Balking.timeout.Main.main(Main.java:10) 23 | 24 | */ -------------------------------------------------------------------------------- /src/main/java/ch07ThreadPerMessage/jucSample6/Main.java: -------------------------------------------------------------------------------- 1 | package ch07ThreadPerMessage.jucSample6; 2 | 3 | import java.util.concurrent.ExecutorService; 4 | import java.util.concurrent.Executors; 5 | 6 | public class Main { 7 | public static void main(String[] args) { 8 | System.out.println("main BEGIN"); 9 | ExecutorService executorService = Executors.newCachedThreadPool(); 10 | Host host = new Host( 11 | executorService 12 | ); 13 | try { 14 | host.request(10, 'A'); 15 | host.request(20, 'B'); 16 | host.request(30, 'C'); 17 | } finally { 18 | executorService.shutdown(); 19 | System.out.println("main END"); 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/ch09Future/jucSample/FutureData.java: -------------------------------------------------------------------------------- 1 | package ch09Future.jucSample; 2 | 3 | import java.util.concurrent.Callable; 4 | import java.util.concurrent.ExecutionException; 5 | import java.util.concurrent.FutureTask; 6 | 7 | public class FutureData extends FutureTask implements Data { 8 | public FutureData(Callable callable) { 9 | super(callable); 10 | } 11 | 12 | public String getContent() { 13 | String string = null; 14 | try { 15 | string = get().getContent(); 16 | } catch (InterruptedException e) { 17 | e.printStackTrace(); 18 | } catch (ExecutionException e) { 19 | e.printStackTrace(); 20 | } 21 | return string; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/ch09Future/sample/Host.java: -------------------------------------------------------------------------------- 1 | package ch09Future.sample; 2 | 3 | public class Host { 4 | public Data request(final int count, final char c) { 5 | System.out.println(" request(" + count + ", " + c + ") BEGIN"); 6 | 7 | // (1) 创建FutureData的实例 8 | final FutureData future = new FutureData(); 9 | 10 | // (2) 启动一个新线程,用于创建RealData的实例 11 | new Thread() { 12 | public void run() { 13 | RealData realdata = new RealData(count, c); 14 | future.setRealData(realdata); 15 | } 16 | }.start(); 17 | 18 | System.out.println(" request(" + count + ", " + c + ") END"); 19 | 20 | // (3) 返回FutureData的实例 21 | return future; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/ch01SingleThreadedExecution/a1_6b/EaterThread.java: -------------------------------------------------------------------------------- 1 | package ch01SingleThreadedExecution.a1_6b; 2 | 3 | public class EaterThread extends Thread { 4 | private final Pair pair; 5 | private String name; 6 | 7 | public EaterThread(String name, Pair pair) { 8 | this.name = name; 9 | this.pair = pair; 10 | } 11 | 12 | public void run() { 13 | while (true) { 14 | eat(); 15 | } 16 | } 17 | 18 | public void eat() { 19 | synchronized (pair) { 20 | System.out.println(name + " takes up " + pair + "."); 21 | System.out.println(name + " is eating now, yum yum!"); 22 | System.out.println(name + " puts down " + pair + "."); 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/ch01SingleThreadedExecution/sample2/Gate.java: -------------------------------------------------------------------------------- 1 | package ch01SingleThreadedExecution.sample2; 2 | 3 | public class Gate { 4 | private int counter = 0; 5 | private String name = "Nobody"; 6 | private String address = "Nowhere"; 7 | 8 | public synchronized void pass(String name, String address) { 9 | this.counter++; 10 | this.name = name; 11 | this.address = address; 12 | check(); 13 | } 14 | 15 | public synchronized String toString() { 16 | return "No." + counter + ": " + name + ", " + address; 17 | } 18 | 19 | private void check() { 20 | if (name.charAt(0) != address.charAt(0)) { 21 | System.out.println("***** BROKEN ***** " + toString()); 22 | } 23 | } 24 | } -------------------------------------------------------------------------------- /src/main/java/ch08WorkerThread/a8_2/ClientThread.java: -------------------------------------------------------------------------------- 1 | package ch08WorkerThread.a8_2; 2 | 3 | import java.util.Random; 4 | 5 | public class ClientThread extends Thread { 6 | private static final Random random = new Random(); 7 | private final Channel channel; 8 | 9 | public ClientThread(String name, Channel channel) { 10 | super(name); 11 | this.channel = channel; 12 | } 13 | 14 | public void run() { 15 | try { 16 | for (int i = 0; true; i++) { 17 | Request request = new Request(getName(), i); 18 | channel.putRequest(request); 19 | Thread.sleep(random.nextInt(1000)); 20 | } 21 | } catch (InterruptedException e) { 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/ch08WorkerThread/sample/ClientThread.java: -------------------------------------------------------------------------------- 1 | package ch08WorkerThread.sample; 2 | 3 | import java.util.Random; 4 | 5 | public class ClientThread extends Thread { 6 | private static final Random random = new Random(); 7 | private final Channel channel; 8 | 9 | public ClientThread(String name, Channel channel) { 10 | super(name); 11 | this.channel = channel; 12 | } 13 | 14 | public void run() { 15 | try { 16 | for (int i = 0; true; i++) { 17 | Request request = new Request(getName(), i); 18 | channel.putRequest(request); 19 | Thread.sleep(random.nextInt(1000)); 20 | } 21 | } catch (InterruptedException e) { 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/ch05ProducerConsumer/a5_7/Host.java: -------------------------------------------------------------------------------- 1 | package ch05ProducerConsumer.a5_7; 2 | 3 | public class Host { 4 | public static void execute(int count) throws InterruptedException { 5 | for (int i = 0; i < count; i++) { 6 | if (Thread.interrupted()) { 7 | throw new InterruptedException(); 8 | } 9 | doHeavyJob(); 10 | } 11 | } 12 | 13 | private static void doHeavyJob() { 14 | // 下面代码用于表示"无法取消的繁重处理"(循环处理约10秒) 15 | System.out.println("doHeavyJob BEGIN"); 16 | long start = System.currentTimeMillis(); 17 | while (start + 10000 > System.currentTimeMillis()) { 18 | // busy loop 19 | } 20 | System.out.println("doHeavyJob END"); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/ch08WorkerThread/jucSample/Main.java: -------------------------------------------------------------------------------- 1 | package ch08WorkerThread.jucSample; 2 | 3 | import java.util.concurrent.ExecutorService; 4 | import java.util.concurrent.Executors; 5 | 6 | public class Main { 7 | public static void main(String[] args) { 8 | ExecutorService executorService = Executors.newFixedThreadPool(5); 9 | 10 | try { 11 | new ClientThread("Alice", executorService).start(); 12 | new ClientThread("Bobby", executorService).start(); 13 | new ClientThread("Chris", executorService).start(); 14 | 15 | // 等待大约5秒 16 | Thread.sleep(5000); 17 | } catch (InterruptedException e) { 18 | } finally { 19 | executorService.shutdown(); 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/ch11ThreadSpecificStorage/a11_3/TSLog.java: -------------------------------------------------------------------------------- 1 | package ch11ThreadSpecificStorage.a11_3; 2 | 3 | import java.io.FileWriter; 4 | import java.io.IOException; 5 | import java.io.PrintWriter; 6 | 7 | public class TSLog { 8 | private PrintWriter writer = null; 9 | 10 | // 初始化writer字段 11 | public TSLog(String filename) { 12 | try { 13 | writer = new PrintWriter(new FileWriter(filename)); 14 | } catch (IOException e) { 15 | e.printStackTrace(); 16 | } 17 | } 18 | 19 | // 写日志 20 | public void println(String s) { 21 | writer.println(s); 22 | } 23 | 24 | // 关闭日志 25 | public void close() { 26 | writer.println("==== End of log ===="); 27 | writer.close(); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/ch11ThreadSpecificStorage/a11_6/TSLog.java: -------------------------------------------------------------------------------- 1 | package ch11ThreadSpecificStorage.a11_6; 2 | 3 | import java.io.FileWriter; 4 | import java.io.IOException; 5 | import java.io.PrintWriter; 6 | 7 | public class TSLog { 8 | private PrintWriter writer = null; 9 | 10 | // 初始化writer字段 11 | public TSLog(String filename) { 12 | try { 13 | writer = new PrintWriter(new FileWriter(filename)); 14 | } catch (IOException e) { 15 | e.printStackTrace(); 16 | } 17 | } 18 | 19 | // 写日志 20 | public void println(String s) { 21 | writer.println(s); 22 | } 23 | 24 | // 关闭日志 25 | public void close() { 26 | writer.println("==== End of log ===="); 27 | writer.close(); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/ch11ThreadSpecificStorage/q11_4/TSLog.java: -------------------------------------------------------------------------------- 1 | package ch11ThreadSpecificStorage.q11_4; 2 | 3 | import java.io.FileWriter; 4 | import java.io.IOException; 5 | import java.io.PrintWriter; 6 | 7 | public class TSLog { 8 | private PrintWriter writer = null; 9 | 10 | // 初始化writer字段 11 | public TSLog(String filename) { 12 | try { 13 | writer = new PrintWriter(new FileWriter(filename)); 14 | } catch (IOException e) { 15 | e.printStackTrace(); 16 | } 17 | } 18 | 19 | // 写日志 20 | public void println(String s) { 21 | writer.println(s); 22 | } 23 | 24 | // 关闭日志 25 | public void close() { 26 | writer.println("==== End of log ===="); 27 | writer.close(); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/ch11ThreadSpecificStorage/q11_6/TSLog.java: -------------------------------------------------------------------------------- 1 | package ch11ThreadSpecificStorage.q11_6; 2 | 3 | import java.io.FileWriter; 4 | import java.io.IOException; 5 | import java.io.PrintWriter; 6 | 7 | public class TSLog { 8 | private PrintWriter writer = null; 9 | 10 | // 初始化writer字段 11 | public TSLog(String filename) { 12 | try { 13 | writer = new PrintWriter(new FileWriter(filename)); 14 | } catch (IOException e) { 15 | e.printStackTrace(); 16 | } 17 | } 18 | 19 | // 写日志 20 | public void println(String s) { 21 | writer.println(s); 22 | } 23 | 24 | // 关闭日志 25 | public void close() { 26 | writer.println("==== End of log ===="); 27 | writer.close(); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/ch11ThreadSpecificStorage/sample1/Log.java: -------------------------------------------------------------------------------- 1 | package ch11ThreadSpecificStorage.sample1; 2 | 3 | import java.io.FileWriter; 4 | import java.io.IOException; 5 | import java.io.PrintWriter; 6 | 7 | public class Log { 8 | private static PrintWriter writer = null; 9 | 10 | // 初始化writer字段 11 | static { 12 | try { 13 | writer = new PrintWriter(new FileWriter("log.txt")); 14 | } catch (IOException e) { 15 | e.printStackTrace(); 16 | } 17 | } 18 | 19 | // 写日志 20 | public static void println(String s) { 21 | writer.println(s); 22 | } 23 | 24 | // 关闭日志 25 | public static void close() { 26 | writer.println("==== End of log ===="); 27 | writer.close(); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/ch11ThreadSpecificStorage/sample2/TSLog.java: -------------------------------------------------------------------------------- 1 | package ch11ThreadSpecificStorage.sample2; 2 | 3 | import java.io.FileWriter; 4 | import java.io.IOException; 5 | import java.io.PrintWriter; 6 | 7 | public class TSLog { 8 | private PrintWriter writer = null; 9 | 10 | // 初始化writer字段 11 | public TSLog(String filename) { 12 | try { 13 | writer = new PrintWriter(new FileWriter(filename)); 14 | } catch (IOException e) { 15 | e.printStackTrace(); 16 | } 17 | } 18 | 19 | // 写日志 20 | public void println(String s) { 21 | writer.println(s); 22 | } 23 | 24 | // 关闭日志 25 | public void close() { 26 | writer.println("==== End of log ===="); 27 | writer.close(); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/ch09Future/a9_3b/content/AsyncContentImpl.java: -------------------------------------------------------------------------------- 1 | package ch09Future.a9_3b.content; 2 | 3 | import java.util.concurrent.Callable; 4 | import java.util.concurrent.ExecutionException; 5 | import java.util.concurrent.FutureTask; 6 | 7 | class AsyncContentImpl extends FutureTask implements Content { 8 | public AsyncContentImpl(Callable callable) { 9 | super(callable); 10 | } 11 | 12 | public byte[] getBytes() { 13 | byte[] bytes = null; 14 | try { 15 | bytes = get().getBytes(); 16 | } catch (InterruptedException e) { 17 | e.printStackTrace(); 18 | } catch (ExecutionException e) { 19 | e.printStackTrace(); 20 | } 21 | return bytes; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/ch09Future/q9_4/RealData.java: -------------------------------------------------------------------------------- 1 | package ch09Future.q9_4; 2 | 3 | public class RealData implements Data { 4 | private final String content; 5 | 6 | public RealData(int count, char c) { 7 | System.out.println(" making RealData(" + count + ", " + c + ") BEGIN"); 8 | char[] buffer = new char[count]; 9 | for (int i = 0; i < count; i++) { 10 | buffer[i] = c; 11 | try { 12 | Thread.sleep(100); 13 | } catch (InterruptedException e) { 14 | } 15 | } 16 | System.out.println(" making RealData(" + count + ", " + c + ") END"); 17 | this.content = new String(buffer); 18 | } 19 | 20 | public String getContent() { 21 | return content; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/ch09Future/a9_4a/RealData.java: -------------------------------------------------------------------------------- 1 | package ch09Future.a9_4a; 2 | 3 | public class RealData implements Data { 4 | private final String content; 5 | 6 | public RealData(int count, char c) { 7 | System.out.println(" making RealData(" + count + ", " + c + ") BEGIN"); 8 | char[] buffer = new char[count]; 9 | for (int i = 0; i < count; i++) { 10 | buffer[i] = c; 11 | try { 12 | Thread.sleep(100); 13 | } catch (InterruptedException e) { 14 | } 15 | } 16 | System.out.println(" making RealData(" + count + ", " + c + ") END"); 17 | this.content = new String(buffer); 18 | } 19 | 20 | public String getContent() { 21 | return content; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/ch09Future/a9_4b/RealData.java: -------------------------------------------------------------------------------- 1 | package ch09Future.a9_4b; 2 | 3 | public class RealData implements Data { 4 | private final String content; 5 | 6 | public RealData(int count, char c) { 7 | System.out.println(" making RealData(" + count + ", " + c + ") BEGIN"); 8 | char[] buffer = new char[count]; 9 | for (int i = 0; i < count; i++) { 10 | buffer[i] = c; 11 | try { 12 | Thread.sleep(100); 13 | } catch (InterruptedException e) { 14 | } 15 | } 16 | System.out.println(" making RealData(" + count + ", " + c + ") END"); 17 | this.content = new String(buffer); 18 | } 19 | 20 | public String getContent() { 21 | return content; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/ch09Future/sample/RealData.java: -------------------------------------------------------------------------------- 1 | package ch09Future.sample; 2 | 3 | public class RealData implements Data { 4 | private final String content; 5 | 6 | public RealData(int count, char c) { 7 | System.out.println(" making RealData(" + count + ", " + c + ") BEGIN"); 8 | char[] buffer = new char[count]; 9 | for (int i = 0; i < count; i++) { 10 | buffer[i] = c; 11 | try { 12 | Thread.sleep(100); 13 | } catch (InterruptedException e) { 14 | } 15 | } 16 | System.out.println(" making RealData(" + count + ", " + c + ") END"); 17 | this.content = new String(buffer); 18 | } 19 | 20 | public String getContent() { 21 | return content; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/ch09Future/jucSample/RealData.java: -------------------------------------------------------------------------------- 1 | package ch09Future.jucSample; 2 | 3 | public class RealData implements Data { 4 | private final String content; 5 | 6 | public RealData(int count, char c) { 7 | System.out.println(" making RealData(" + count + ", " + c + ") BEGIN"); 8 | char[] buffer = new char[count]; 9 | for (int i = 0; i < count; i++) { 10 | buffer[i] = c; 11 | try { 12 | Thread.sleep(100); 13 | } catch (InterruptedException e) { 14 | } 15 | } 16 | System.out.println(" making RealData(" + count + ", " + c + ") END"); 17 | this.content = new String(buffer); 18 | } 19 | 20 | public String getContent() { 21 | return content; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/ch07ThreadPerMessage/jucSample7/Main.java: -------------------------------------------------------------------------------- 1 | package ch07ThreadPerMessage.jucSample7; 2 | 3 | import java.util.concurrent.Executors; 4 | import java.util.concurrent.ScheduledExecutorService; 5 | 6 | public class Main { 7 | public static void main(String[] args) { 8 | System.out.println("main BEGIN"); 9 | ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(5); 10 | Host host = new Host( 11 | scheduledExecutorService 12 | ); 13 | try { 14 | host.request(10, 'A'); 15 | host.request(20, 'B'); 16 | host.request(30, 'C'); 17 | } finally { 18 | scheduledExecutorService.shutdown(); 19 | System.out.println("main END"); 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/ch08WorkerThread/a8_6/Main.java: -------------------------------------------------------------------------------- 1 | package ch08WorkerThread.a8_6; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | Channel channel = new Channel(5); // 工人线程的个数 6 | channel.startWorkers(); 7 | ClientThread alice = new ClientThread("Alice", channel); 8 | ClientThread bobby = new ClientThread("Bobby", channel); 9 | ClientThread chris = new ClientThread("Chris", channel); 10 | alice.start(); 11 | bobby.start(); 12 | chris.start(); 13 | 14 | try { 15 | Thread.sleep(5000); 16 | } catch (InterruptedException e) { 17 | } 18 | alice.stopThread(); 19 | bobby.stopThread(); 20 | chris.stopThread(); 21 | channel.stopAllWorkers(); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/ch10TwoPhaseTermination/a10_7/Main.java: -------------------------------------------------------------------------------- 1 | package ch10TwoPhaseTermination.a10_7; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | System.out.println("main: BEGIN"); 6 | try { 7 | // 启动线程 8 | HanoiThread t = new HanoiThread(); 9 | t.start(); 10 | 11 | // 稍微间隔一段时间 12 | Thread.sleep(10000); 13 | 14 | // 线程的终止请求 15 | System.out.println("main: shutdownRequest"); 16 | t.shutdownRequest(); 17 | 18 | // 等待线程终止 19 | System.out.println("main: join"); 20 | t.join(); 21 | } catch (InterruptedException e) { 22 | e.printStackTrace(); 23 | } 24 | System.out.println("main: END"); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/ch10TwoPhaseTermination/q10_7/Main.java: -------------------------------------------------------------------------------- 1 | package ch10TwoPhaseTermination.q10_7; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | System.out.println("main: BEGIN"); 6 | try { 7 | // 启动线程 8 | HanoiThread t = new HanoiThread(); 9 | t.start(); 10 | 11 | // 稍微间隔一段时间 12 | Thread.sleep(10000); 13 | 14 | // 线程的终止请求 15 | System.out.println("main: shutdownRequest"); 16 | t.shutdownRequest(); 17 | 18 | // 等待线程终止 19 | System.out.println("main: join"); 20 | t.join(); 21 | } catch (InterruptedException e) { 22 | e.printStackTrace(); 23 | } 24 | System.out.println("main: END"); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/ch08WorkerThread/a8_2/Request.java: -------------------------------------------------------------------------------- 1 | package ch08WorkerThread.a8_2; 2 | 3 | import java.util.Random; 4 | 5 | public class Request { 6 | private static final Random random = new Random(); 7 | private final String name; // 委托者 8 | private final int number; // 请求的编号 9 | 10 | public Request(String name, int number) { 11 | this.name = name; 12 | this.number = number; 13 | } 14 | 15 | public void execute() { 16 | System.out.println(Thread.currentThread().getName() + " executes " + this); 17 | try { 18 | Thread.sleep(random.nextInt(1000)); 19 | } catch (InterruptedException e) { 20 | } 21 | } 22 | 23 | public String toString() { 24 | return "[ Request from " + name + " No." + number + " ]"; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/ch08WorkerThread/a8_6/Request.java: -------------------------------------------------------------------------------- 1 | package ch08WorkerThread.a8_6; 2 | 3 | import java.util.Random; 4 | 5 | public class Request { 6 | private static final Random random = new Random(); 7 | private final String name; // 委托者 8 | private final int number; // 请求的编号 9 | 10 | public Request(String name, int number) { 11 | this.name = name; 12 | this.number = number; 13 | } 14 | 15 | public void execute() { 16 | System.out.println(Thread.currentThread().getName() + " executes " + this); 17 | try { 18 | Thread.sleep(random.nextInt(1000)); 19 | } catch (InterruptedException e) { 20 | } 21 | } 22 | 23 | public String toString() { 24 | return "[ Request from " + name + " No." + number + " ]"; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/ch12ActiveObject/sample/activeobject/Proxy.java: -------------------------------------------------------------------------------- 1 | package ch12ActiveObject.sample.activeobject; 2 | 3 | class Proxy implements ActiveObject { 4 | private final SchedulerThread scheduler; 5 | private final Servant servant; 6 | 7 | public Proxy(SchedulerThread scheduler, Servant servant) { 8 | this.scheduler = scheduler; 9 | this.servant = servant; 10 | } 11 | 12 | public Result makeString(int count, char fillchar) { 13 | FutureResult future = new FutureResult(); 14 | scheduler.invoke(new MakeStringRequest(servant, future, count, fillchar)); 15 | return future; 16 | } 17 | 18 | public void displayString(String string) { 19 | scheduler.invoke(new DisplayStringRequest(servant, string)); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/ch06ReadWriteLock/a6_4a/RetrieveThread.java: -------------------------------------------------------------------------------- 1 | package ch06ReadWriteLock.a6_4a; 2 | 3 | import java.util.concurrent.atomic.AtomicInteger; 4 | 5 | public class RetrieveThread extends Thread { 6 | private static final AtomicInteger atomicCounter = new AtomicInteger(0); 7 | private final Database database; 8 | private final String key; 9 | 10 | public RetrieveThread(Database database, String key) { 11 | this.database = database; 12 | this.key = key; 13 | } 14 | 15 | public void run() { 16 | while (true) { 17 | int counter = atomicCounter.incrementAndGet(); 18 | String value = database.retrieve(key); 19 | System.out.println(counter + ":" + key + " => " + value); 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/ch06ReadWriteLock/a6_4b/RetrieveThread.java: -------------------------------------------------------------------------------- 1 | package ch06ReadWriteLock.a6_4b; 2 | 3 | import java.util.concurrent.atomic.AtomicInteger; 4 | 5 | public class RetrieveThread extends Thread { 6 | private static final AtomicInteger atomicCounter = new AtomicInteger(0); 7 | private final Database database; 8 | private final String key; 9 | 10 | public RetrieveThread(Database database, String key) { 11 | this.database = database; 12 | this.key = key; 13 | } 14 | 15 | public void run() { 16 | while (true) { 17 | int counter = atomicCounter.incrementAndGet(); 18 | String value = database.retrieve(key); 19 | System.out.println(counter + ":" + key + " => " + value); 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/ch08WorkerThread/sample/Request.java: -------------------------------------------------------------------------------- 1 | package ch08WorkerThread.sample; 2 | 3 | import java.util.Random; 4 | 5 | public class Request { 6 | private static final Random random = new Random(); 7 | private final String name; // 委托者 8 | private final int number; // 请求的编号 9 | 10 | public Request(String name, int number) { 11 | this.name = name; 12 | this.number = number; 13 | } 14 | 15 | public void execute() { 16 | System.out.println(Thread.currentThread().getName() + " executes " + this); 17 | try { 18 | Thread.sleep(random.nextInt(1000)); 19 | } catch (InterruptedException e) { 20 | } 21 | } 22 | 23 | public String toString() { 24 | return "[ Request from " + name + " No." + number + " ]"; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/ch10TwoPhaseTermination/a10_2/Main.java: -------------------------------------------------------------------------------- 1 | package ch10TwoPhaseTermination.a10_2; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | System.out.println("main: BEGIN"); 6 | try { 7 | // 启动线程 8 | CountupThread t = new CountupThread(); 9 | t.start(); 10 | 11 | // 稍微间隔一段时间 12 | Thread.sleep(10000); 13 | 14 | // 线程的终止请求 15 | System.out.println("main: shutdownRequest"); 16 | t.shutdownRequest(); 17 | 18 | System.out.println("main: join"); 19 | 20 | // 等待线程终止 21 | t.join(); 22 | } catch (InterruptedException e) { 23 | e.printStackTrace(); 24 | } 25 | System.out.println("main: END"); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/ch10TwoPhaseTermination/a10_3/Main.java: -------------------------------------------------------------------------------- 1 | package ch10TwoPhaseTermination.a10_3; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | System.out.println("main: BEGIN"); 6 | try { 7 | // 启动线程 8 | CountupThread t = new CountupThread(); 9 | t.start(); 10 | 11 | // 稍微间隔一段时间 12 | Thread.sleep(10000); 13 | 14 | // 线程的终止请求 15 | System.out.println("main: shutdownRequest"); 16 | t.shutdownRequest(); 17 | 18 | System.out.println("main: join"); 19 | 20 | // 等待线程终止 21 | t.join(); 22 | } catch (InterruptedException e) { 23 | e.printStackTrace(); 24 | } 25 | System.out.println("main: END"); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/ch10TwoPhaseTermination/a10_4/Main.java: -------------------------------------------------------------------------------- 1 | package ch10TwoPhaseTermination.a10_4; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | System.out.println("main: BEGIN"); 6 | try { 7 | // 启动线程 8 | CountupThread t = new CountupThread(); 9 | t.start(); 10 | 11 | // 稍微间隔一段时间 12 | Thread.sleep(10000); 13 | 14 | // 线程的终止请求 15 | System.out.println("main: shutdownRequest"); 16 | t.shutdownRequest(); 17 | 18 | System.out.println("main: join"); 19 | 20 | // 等待线程终止 21 | t.join(); 22 | } catch (InterruptedException e) { 23 | e.printStackTrace(); 24 | } 25 | System.out.println("main: END"); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/ch10TwoPhaseTermination/q10_2/Main.java: -------------------------------------------------------------------------------- 1 | package ch10TwoPhaseTermination.q10_2; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | System.out.println("main: BEGIN"); 6 | try { 7 | // 启动线程 8 | CountupThread t = new CountupThread(); 9 | t.start(); 10 | 11 | // 稍微间隔一段时间 12 | Thread.sleep(10000); 13 | 14 | // 线程的终止请求 15 | System.out.println("main: shutdownRequest"); 16 | t.shutdownRequest(); 17 | 18 | System.out.println("main: join"); 19 | 20 | // 等待线程终止 21 | t.join(); 22 | } catch (InterruptedException e) { 23 | e.printStackTrace(); 24 | } 25 | System.out.println("main: END"); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/ch10TwoPhaseTermination/sample/Main.java: -------------------------------------------------------------------------------- 1 | package ch10TwoPhaseTermination.sample; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | System.out.println("main: BEGIN"); 6 | try { 7 | // 启动线程 8 | CountupThread t = new CountupThread(); 9 | t.start(); 10 | 11 | // 稍微间隔一段时间 12 | Thread.sleep(10000); 13 | 14 | // 线程的终止请求 15 | System.out.println("main: shutdownRequest"); 16 | t.shutdownRequest(); 17 | 18 | System.out.println("main: join"); 19 | 20 | // 等待线程终止 21 | t.join(); 22 | } catch (InterruptedException e) { 23 | e.printStackTrace(); 24 | } 25 | System.out.println("main: END"); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/ch11ThreadSpecificStorage/a11_6/Log.java: -------------------------------------------------------------------------------- 1 | package ch11ThreadSpecificStorage.a11_6; 2 | 3 | public class Log { 4 | private static final ThreadLocal tsLogCollection = new ThreadLocal(); 5 | 6 | // 写日志く 7 | public static void println(String s) { 8 | getTSLog().println(s); 9 | } 10 | 11 | // 关闭日志 12 | public static void close() { 13 | getTSLog().close(); 14 | } 15 | 16 | // 获得线程特有的日志 17 | private static TSLog getTSLog() { 18 | TSLog tsLog = tsLogCollection.get(); 19 | 20 | // 如果该线程是第一次调用本方法,就新生成并注册一个日志 21 | if (tsLog == null) { 22 | tsLog = new TSLog(Thread.currentThread().getName() + "-log.txt"); 23 | tsLogCollection.set(tsLog); 24 | } 25 | 26 | return tsLog; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/ch11ThreadSpecificStorage/q11_4/Log.java: -------------------------------------------------------------------------------- 1 | package ch11ThreadSpecificStorage.q11_4; 2 | 3 | public class Log { 4 | private static final ThreadLocal tsLogCollection = new ThreadLocal(); 5 | 6 | // 写日志 7 | public static void println(String s) { 8 | getTSLog().println(s); 9 | } 10 | 11 | // 关闭日志 12 | public static void close() { 13 | getTSLog().close(); 14 | } 15 | 16 | // 获取线程特有的日志 17 | private static TSLog getTSLog() { 18 | TSLog tsLog = tsLogCollection.get(); 19 | 20 | // 如果该线程是第一次调用本方法,就新生成并注册一个日志 21 | if (tsLog == null) { 22 | tsLog = new TSLog(Thread.currentThread().getName() + "-log.txt"); 23 | tsLogCollection.set(tsLog); 24 | } 25 | 26 | return tsLog; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/ch11ThreadSpecificStorage/q11_6/Log.java: -------------------------------------------------------------------------------- 1 | package ch11ThreadSpecificStorage.q11_6; 2 | 3 | public class Log { 4 | private static final ThreadLocal tsLogCollection = new ThreadLocal(); 5 | 6 | // 写日志 7 | public static void println(String s) { 8 | getTSLog().println(s); 9 | } 10 | 11 | // 关闭日志 12 | public static void close() { 13 | getTSLog().close(); 14 | } 15 | 16 | // 获取线程特有的日志 17 | private static TSLog getTSLog() { 18 | TSLog tsLog = tsLogCollection.get(); 19 | 20 | // 如果该线程是第一次调用本方法,就新生成并注册一个日志 21 | if (tsLog == null) { 22 | tsLog = new TSLog(Thread.currentThread().getName() + "-log.txt"); 23 | tsLogCollection.set(tsLog); 24 | } 25 | 26 | return tsLog; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/ch11ThreadSpecificStorage/sample2/Log.java: -------------------------------------------------------------------------------- 1 | package ch11ThreadSpecificStorage.sample2; 2 | 3 | public class Log { 4 | private static final ThreadLocal tsLogCollection = new ThreadLocal(); 5 | 6 | // 写日志 7 | public static void println(String s) { 8 | getTSLog().println(s); 9 | } 10 | 11 | // 关闭日志 12 | public static void close() { 13 | getTSLog().close(); 14 | } 15 | 16 | // 获取线程特有的日志 17 | private static TSLog getTSLog() { 18 | TSLog tsLog = tsLogCollection.get(); 19 | 20 | // 如果该线程是第一次调用本方法,就新生成并注册一个日志 21 | if (tsLog == null) { 22 | tsLog = new TSLog(Thread.currentThread().getName() + "-log.txt"); 23 | tsLogCollection.set(tsLog); 24 | } 25 | 26 | return tsLog; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/test/java/com/gmail/mosoft521/AppTest.java: -------------------------------------------------------------------------------- 1 | package com.gmail.mosoft521; 2 | 3 | import junit.framework.Test; 4 | import junit.framework.TestCase; 5 | import junit.framework.TestSuite; 6 | 7 | /** 8 | * Unit test for simple App. 9 | */ 10 | public class AppTest 11 | extends TestCase { 12 | /** 13 | * Create the test case 14 | * 15 | * @param testName name of the test case 16 | */ 17 | public AppTest(String testName) { 18 | super(testName); 19 | } 20 | 21 | /** 22 | * @return the suite of tests being tested 23 | */ 24 | public static Test suite() { 25 | return new TestSuite(AppTest.class); 26 | } 27 | 28 | /** 29 | * Rigourous Test :-) 30 | */ 31 | public void testApp() { 32 | assertTrue(true); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/main/java/ch06ReadWriteLock/a6_3a/ReaderThread.java: -------------------------------------------------------------------------------- 1 | package ch06ReadWriteLock.a6_3a; 2 | 3 | public class ReaderThread extends Thread { 4 | private final Data data; 5 | 6 | public ReaderThread(Data data) { 7 | this.data = data; 8 | } 9 | 10 | public void run() { 11 | try { 12 | long begin = System.currentTimeMillis(); 13 | for (int i = 0; i < 20; i++) { 14 | char[] readbuf = data.read(); 15 | System.out.println(Thread.currentThread().getName() + " reads " + String.valueOf(readbuf)); 16 | } 17 | long time = System.currentTimeMillis() - begin; 18 | System.out.println(Thread.currentThread().getName() + ": time = " + time); 19 | } catch (InterruptedException e) { 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/ch06ReadWriteLock/a6_3b/ReaderThread.java: -------------------------------------------------------------------------------- 1 | package ch06ReadWriteLock.a6_3b; 2 | 3 | public class ReaderThread extends Thread { 4 | private final Data data; 5 | 6 | public ReaderThread(Data data) { 7 | this.data = data; 8 | } 9 | 10 | public void run() { 11 | try { 12 | long begin = System.currentTimeMillis(); 13 | for (int i = 0; i < 20; i++) { 14 | char[] readbuf = data.read(); 15 | System.out.println(Thread.currentThread().getName() + " reads " + String.valueOf(readbuf)); 16 | } 17 | long time = System.currentTimeMillis() - begin; 18 | System.out.println(Thread.currentThread().getName() + ": time = " + time); 19 | } catch (InterruptedException e) { 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/ch07ThreadPerMessage/jucSample5/Host.java: -------------------------------------------------------------------------------- 1 | package ch07ThreadPerMessage.jucSample5; 2 | 3 | import java.util.concurrent.Executor; 4 | 5 | public class Host { 6 | private final Helper helper = new Helper(); 7 | private final Executor executor; 8 | 9 | public Host(Executor executor) { 10 | this.executor = executor; 11 | } 12 | 13 | public void request(final int count, final char c) { 14 | System.out.println(" request(" + count + ", " + c + ") BEGIN"); 15 | executor.execute( 16 | new Runnable() { 17 | public void run() { 18 | helper.handle(count, c); 19 | } 20 | } 21 | ); 22 | System.out.println(" request(" + count + ", " + c + ") END"); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/ch07ThreadPerMessage/jucSample6/Host.java: -------------------------------------------------------------------------------- 1 | package ch07ThreadPerMessage.jucSample6; 2 | 3 | import java.util.concurrent.Executor; 4 | 5 | public class Host { 6 | private final Helper helper = new Helper(); 7 | private final Executor executor; 8 | 9 | public Host(Executor executor) { 10 | this.executor = executor; 11 | } 12 | 13 | public void request(final int count, final char c) { 14 | System.out.println(" request(" + count + ", " + c + ") BEGIN"); 15 | executor.execute( 16 | new Runnable() { 17 | public void run() { 18 | helper.handle(count, c); 19 | } 20 | } 21 | ); 22 | System.out.println(" request(" + count + ", " + c + ") END"); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/ch10TwoPhaseTermination/a10_5/Service.java: -------------------------------------------------------------------------------- 1 | package ch10TwoPhaseTermination.a10_5; 2 | 3 | public class Service { 4 | private static GracefulThread thread = null; 5 | 6 | // 服务开始运行(如果服务在运行中则balk) 7 | public synchronized static void service() { 8 | System.out.print("service"); 9 | if (thread != null && thread.isAlive()) { 10 | // Balking 11 | System.out.println(" is balked."); 12 | return; 13 | } 14 | // Thread-Per-Message 15 | thread = new ServiceThread(); 16 | thread.start(); 17 | } 18 | 19 | // 服务中止 20 | public synchronized static void cancel() { 21 | if (thread != null) { 22 | System.out.println("cancel."); 23 | thread.shutdownRequest(); 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/ch12ActiveObject/sample/activeobject/Servant.java: -------------------------------------------------------------------------------- 1 | package ch12ActiveObject.sample.activeobject; 2 | 3 | class Servant implements ActiveObject { 4 | public Result makeString(int count, char fillchar) { 5 | char[] buffer = new char[count]; 6 | for (int i = 0; i < count; i++) { 7 | buffer[i] = fillchar; 8 | try { 9 | Thread.sleep(100); 10 | } catch (InterruptedException e) { 11 | } 12 | } 13 | return new RealResult(new String(buffer)); 14 | } 15 | 16 | public void displayString(String string) { 17 | try { 18 | System.out.println("displayString: " + string); 19 | Thread.sleep(10); 20 | } catch (InterruptedException e) { 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/ch12ActiveObject/sample/DisplayClientThread.java: -------------------------------------------------------------------------------- 1 | package ch12ActiveObject.sample; 2 | 3 | import ch12ActiveObject.sample.activeobject.ActiveObject; 4 | 5 | public class DisplayClientThread extends Thread { 6 | private final ActiveObject activeObject; 7 | 8 | public DisplayClientThread(String name, ActiveObject activeObject) { 9 | super(name); 10 | this.activeObject = activeObject; 11 | } 12 | 13 | public void run() { 14 | try { 15 | for (int i = 0; true; i++) { 16 | // 有返回值的调用 17 | String string = Thread.currentThread().getName() + " " + i; 18 | activeObject.displayString(string); 19 | Thread.sleep(200); 20 | } 21 | } catch (InterruptedException e) { 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/ch00Introduction1/ai1_4/Bank.java: -------------------------------------------------------------------------------- 1 | package ch00Introduction1.ai1_4; 2 | 3 | public class Bank { 4 | private int money; 5 | private String name; 6 | 7 | public Bank(String name, int money) { 8 | this.name = name; 9 | this.money = money; 10 | } 11 | 12 | public void deposit(int m) { 13 | money += m; 14 | } 15 | 16 | public boolean withdraw(int m) { 17 | if (money >= m) { 18 | money -= m; 19 | check(); 20 | return true; 21 | } else { 22 | return false; 23 | } 24 | } 25 | 26 | public String getName() { 27 | return name; 28 | } 29 | 30 | private void check() { 31 | if (money < 0) { 32 | System.out.println("可用余额为负数! money = " + money); 33 | } 34 | } 35 | } -------------------------------------------------------------------------------- /src/main/java/ch00Introduction1/qi1_4/Bank.java: -------------------------------------------------------------------------------- 1 | package ch00Introduction1.qi1_4; 2 | 3 | public class Bank { 4 | private int money; 5 | private String name; 6 | 7 | public Bank(String name, int money) { 8 | this.name = name; 9 | this.money = money; 10 | } 11 | 12 | public void deposit(int m) { 13 | money += m; 14 | } 15 | 16 | public boolean withdraw(int m) { 17 | if (money >= m) { 18 | money -= m; 19 | check(); 20 | return true; 21 | } else { 22 | return false; 23 | } 24 | } 25 | 26 | public String getName() { 27 | return name; 28 | } 29 | 30 | private void check() { 31 | if (money < 0) { 32 | System.out.println("可用余额为负数! money = " + money); 33 | } 34 | } 35 | } -------------------------------------------------------------------------------- /src/main/java/ch08WorkerThread/jucSample/Request.java: -------------------------------------------------------------------------------- 1 | package ch08WorkerThread.jucSample; 2 | 3 | import java.util.Random; 4 | 5 | public class Request implements Runnable { 6 | private static final Random random = new Random(); 7 | private final String name; // 委托者 8 | private final int number; // 请求的编号 9 | 10 | public Request(String name, int number) { 11 | this.name = name; 12 | this.number = number; 13 | } 14 | 15 | public void run() { 16 | System.out.println(Thread.currentThread().getName() + " executes " + this); 17 | try { 18 | Thread.sleep(random.nextInt(1000)); 19 | } catch (InterruptedException e) { 20 | } 21 | } 22 | 23 | public String toString() { 24 | return "[ Request from " + name + " No." + number + " ]"; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/ch04Balking/a4_2a/Main.java: -------------------------------------------------------------------------------- 1 | package ch04Balking.a4_2a; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | Data data = new Data("data.txt", "(empty)"); 6 | new ChangerThread("ChangerThread", data).start(); 7 | new SaverThread("SaverThread", data).start(); 8 | } 9 | } 10 | /* 11 | SaverThread calls doSave, content = No.0 12 | ChangerThread balks 13 | SaverThread calls doSave, content = No.1 14 | ChangerThread balks 15 | ChangerThread calls doSave, content = No.2 16 | SaverThread calls doSave, content = No.3 17 | ChangerThread balks 18 | SaverThread calls doSave, content = No.4 19 | ChangerThread balks 20 | ChangerThread calls doSave, content = No.5 21 | ChangerThread calls doSave, content = No.6 22 | SaverThread calls doSave, content = No.7 23 | ChangerThread balks 24 | ... 25 | */ -------------------------------------------------------------------------------- /src/main/java/ch07ThreadPerMessage/q7_5/MyFrame.java: -------------------------------------------------------------------------------- 1 | package ch07ThreadPerMessage.q7_5; 2 | 3 | import javax.swing.*; 4 | import java.awt.*; 5 | import java.awt.event.ActionEvent; 6 | import java.awt.event.ActionListener; 7 | 8 | public class MyFrame extends JFrame implements ActionListener { 9 | public MyFrame() { 10 | super("MyFrame"); 11 | getContentPane().setLayout(new FlowLayout()); 12 | getContentPane().add(new JLabel("Thread-Per-Message Sample")); 13 | JButton button = new JButton("Execute"); 14 | getContentPane().add(button); 15 | button.addActionListener(this); 16 | setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 17 | pack(); 18 | setVisible(true); 19 | } 20 | 21 | public void actionPerformed(ActionEvent e) { 22 | Service.service(); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/ch01SingleThreadedExecution/a1_1/Gate.java: -------------------------------------------------------------------------------- 1 | package ch01SingleThreadedExecution.a1_1; 2 | 3 | public class Gate { 4 | private int counter = 0; 5 | private String name = "Nobody"; 6 | private String address = "Nowhere"; 7 | 8 | public void pass(String name, String address) { 9 | this.counter++; 10 | this.name = name; 11 | try { 12 | Thread.sleep(1000); 13 | } catch (InterruptedException e) { 14 | } 15 | this.address = address; 16 | check(); 17 | } 18 | 19 | public String toString() { 20 | return "No." + counter + ": " + name + ", " + address; 21 | } 22 | 23 | private void check() { 24 | if (name.charAt(0) != address.charAt(0)) { 25 | System.out.println("***** BROKEN ***** " + toString()); 26 | } 27 | } 28 | } -------------------------------------------------------------------------------- /src/main/java/ch07ThreadPerMessage/a7_5a/MyFrame.java: -------------------------------------------------------------------------------- 1 | package ch07ThreadPerMessage.a7_5a; 2 | 3 | import javax.swing.*; 4 | import java.awt.*; 5 | import java.awt.event.ActionEvent; 6 | import java.awt.event.ActionListener; 7 | 8 | public class MyFrame extends JFrame implements ActionListener { 9 | public MyFrame() { 10 | super("MyFrame"); 11 | getContentPane().setLayout(new FlowLayout()); 12 | getContentPane().add(new JLabel("Thread-Per-Message Sample")); 13 | JButton button = new JButton("Execute"); 14 | getContentPane().add(button); 15 | button.addActionListener(this); 16 | setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 17 | pack(); 18 | setVisible(true); 19 | } 20 | 21 | public void actionPerformed(ActionEvent e) { 22 | Service.service(); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/ch07ThreadPerMessage/a7_5b/MyFrame.java: -------------------------------------------------------------------------------- 1 | package ch07ThreadPerMessage.a7_5b; 2 | 3 | import javax.swing.*; 4 | import java.awt.*; 5 | import java.awt.event.ActionEvent; 6 | import java.awt.event.ActionListener; 7 | 8 | public class MyFrame extends JFrame implements ActionListener { 9 | public MyFrame() { 10 | super("MyFrame"); 11 | getContentPane().setLayout(new FlowLayout()); 12 | getContentPane().add(new JLabel("Thread-Per-Message Sample")); 13 | JButton button = new JButton("Execute"); 14 | getContentPane().add(button); 15 | button.addActionListener(this); 16 | setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 17 | pack(); 18 | setVisible(true); 19 | } 20 | 21 | public void actionPerformed(ActionEvent e) { 22 | Service.service(); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/ch07ThreadPerMessage/a7_5c/MyFrame.java: -------------------------------------------------------------------------------- 1 | package ch07ThreadPerMessage.a7_5c; 2 | 3 | import javax.swing.*; 4 | import java.awt.*; 5 | import java.awt.event.ActionEvent; 6 | import java.awt.event.ActionListener; 7 | 8 | public class MyFrame extends JFrame implements ActionListener { 9 | public MyFrame() { 10 | super("MyFrame"); 11 | getContentPane().setLayout(new FlowLayout()); 12 | getContentPane().add(new JLabel("Thread-Per-Message Sample")); 13 | JButton button = new JButton("Execute"); 14 | getContentPane().add(button); 15 | button.addActionListener(this); 16 | setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 17 | pack(); 18 | setVisible(true); 19 | } 20 | 21 | public void actionPerformed(ActionEvent e) { 22 | Service.service(); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/ch07ThreadPerMessage/a7_5d/MyFrame.java: -------------------------------------------------------------------------------- 1 | package ch07ThreadPerMessage.a7_5d; 2 | 3 | import javax.swing.*; 4 | import java.awt.*; 5 | import java.awt.event.ActionEvent; 6 | import java.awt.event.ActionListener; 7 | 8 | public class MyFrame extends JFrame implements ActionListener { 9 | public MyFrame() { 10 | super("MyFrame"); 11 | getContentPane().setLayout(new FlowLayout()); 12 | getContentPane().add(new JLabel("Thread-Per-Message Sample")); 13 | JButton button = new JButton("Execute"); 14 | getContentPane().add(button); 15 | button.addActionListener(this); 16 | setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 17 | pack(); 18 | setVisible(true); 19 | } 20 | 21 | public void actionPerformed(ActionEvent e) { 22 | Service.service(); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/ch09Future/sample/Main.java: -------------------------------------------------------------------------------- 1 | package ch09Future.sample; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | System.out.println("main BEGIN"); 6 | Host host = new Host(); 7 | Data data1 = host.request(10, 'A'); 8 | Data data2 = host.request(20, 'B'); 9 | Data data3 = host.request(30, 'C'); 10 | 11 | System.out.println("main otherJob BEGIN"); 12 | try { 13 | Thread.sleep(2000); 14 | } catch (InterruptedException e) { 15 | } 16 | System.out.println("main otherJob END"); 17 | 18 | System.out.println("data1 = " + data1.getContent()); 19 | System.out.println("data2 = " + data2.getContent()); 20 | System.out.println("data3 = " + data3.getContent()); 21 | System.out.println("main END"); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/ch09Future/jucSample/Main.java: -------------------------------------------------------------------------------- 1 | package ch09Future.jucSample; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | System.out.println("main BEGIN"); 6 | Host host = new Host(); 7 | Data data1 = host.request(10, 'A'); 8 | Data data2 = host.request(20, 'B'); 9 | Data data3 = host.request(30, 'C'); 10 | 11 | System.out.println("main otherJob BEGIN"); 12 | try { 13 | Thread.sleep(2000); 14 | } catch (InterruptedException e) { 15 | } 16 | System.out.println("main otherJob END"); 17 | 18 | System.out.println("data1 = " + data1.getContent()); 19 | System.out.println("data2 = " + data2.getContent()); 20 | System.out.println("data3 = " + data3.getContent()); 21 | System.out.println("main END"); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/ch03GuardedSuspension/sample/Main.java: -------------------------------------------------------------------------------- 1 | package ch03GuardedSuspension.sample; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | RequestQueue requestQueue = new RequestQueue(); 6 | new ClientThread(requestQueue, "Alice", 3141592L).start(); 7 | new ServerThread(requestQueue, "Bobby", 6535897L).start(); 8 | } 9 | } 10 | /* 11 | Alice requests [ Request No.0 ] 12 | Bobby handles [ Request No.0 ] 13 | Alice requests [ Request No.1 ] 14 | Alice requests [ Request No.2 ] 15 | Bobby handles [ Request No.1 ] 16 | Bobby handles [ Request No.2 ] 17 | Alice requests [ Request No.3 ] 18 | Bobby handles [ Request No.3 ] 19 | Alice requests [ Request No.4 ] 20 | Bobby handles [ Request No.4 ] 21 | Alice requests [ Request No.5 ] 22 | Alice requests [ Request No.6 ] 23 | Bobby handles [ Request No.5 ] 24 | ... 25 | */ -------------------------------------------------------------------------------- /src/main/java/ch07ThreadPerMessage/jucSample3/Host.java: -------------------------------------------------------------------------------- 1 | package ch07ThreadPerMessage.jucSample3; 2 | 3 | import java.util.concurrent.ThreadFactory; 4 | 5 | public class Host { 6 | private final Helper helper = new Helper(); 7 | private final ThreadFactory threadFactory; 8 | 9 | public Host(ThreadFactory threadFactory) { 10 | this.threadFactory = threadFactory; 11 | } 12 | 13 | public void request(final int count, final char c) { 14 | System.out.println(" request(" + count + ", " + c + ") BEGIN"); 15 | threadFactory.newThread( 16 | new Runnable() { 17 | public void run() { 18 | helper.handle(count, c); 19 | } 20 | } 21 | ).start(); 22 | System.out.println(" request(" + count + ", " + c + ") END"); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/ch07ThreadPerMessage/jucSample4/Host.java: -------------------------------------------------------------------------------- 1 | package ch07ThreadPerMessage.jucSample4; 2 | 3 | import java.util.concurrent.ThreadFactory; 4 | 5 | public class Host { 6 | private final Helper helper = new Helper(); 7 | private final ThreadFactory threadFactory; 8 | 9 | public Host(ThreadFactory threadFactory) { 10 | this.threadFactory = threadFactory; 11 | } 12 | 13 | public void request(final int count, final char c) { 14 | System.out.println(" request(" + count + ", " + c + ") BEGIN"); 15 | threadFactory.newThread( 16 | new Runnable() { 17 | public void run() { 18 | helper.handle(count, c); 19 | } 20 | } 21 | ).start(); 22 | System.out.println(" request(" + count + ", " + c + ") END"); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/ch99AppendixB/synchronized1/Main.java: -------------------------------------------------------------------------------- 1 | package ch99AppendixB.synchronized1; 2 | 3 | class Something { 4 | private int x = 0; 5 | private int y = 0; 6 | 7 | public void write() { 8 | x = 100; 9 | y = 50; 10 | } 11 | 12 | public void read() { 13 | if (x < y) { 14 | System.out.println("x < y"); 15 | } 16 | } 17 | } 18 | 19 | public class Main { 20 | public static void main(String[] args) { 21 | final Something obj = new Something(); 22 | 23 | // 写数据的线程A 24 | new Thread() { 25 | public void run() { 26 | obj.write(); 27 | } 28 | }.start(); 29 | 30 | // 读数据的线程B 31 | new Thread() { 32 | public void run() { 33 | obj.read(); 34 | } 35 | }.start(); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/main/java/ch03GuardedSuspension/q3_6/ServerThread.java: -------------------------------------------------------------------------------- 1 | package ch03GuardedSuspension.q3_6; 2 | 3 | import java.util.Random; 4 | 5 | public class ServerThread extends Thread { 6 | private final Random random; 7 | private final RequestQueue requestQueue; 8 | 9 | public ServerThread(RequestQueue requestQueue, String name, long seed) { 10 | super(name); 11 | this.requestQueue = requestQueue; 12 | this.random = new Random(seed); 13 | } 14 | 15 | public void run() { 16 | for (int i = 0; i < 10000; i++) { 17 | Request request = requestQueue.getRequest(); 18 | System.out.println(Thread.currentThread().getName() + " handles " + request); 19 | try { 20 | Thread.sleep(random.nextInt(1000)); 21 | } catch (InterruptedException e) { 22 | } 23 | } 24 | } 25 | } --------------------------------------------------------------------------------