├── .idea ├── .name ├── copyright │ └── profiles_settings.xml ├── encodings.xml ├── vcs.xml ├── kotlinc.xml └── misc.xml ├── sharing ├── image2017-3-9 16-16-16.png ├── src │ └── main │ │ └── java │ │ └── com │ │ └── wangwenjun │ │ └── concurrency │ │ ├── chapter2 │ │ ├── CalculatorStrategy.java │ │ ├── SimpleCalculatorStrategy.java │ │ ├── TicketWindow.java │ │ ├── Bank.java │ │ ├── TicketWindowRunnable.java │ │ ├── BankVersion2.java │ │ ├── TaxCalculatorMain.java │ │ └── TaxCalaculator.java │ │ ├── chapter11 │ │ ├── Test1.java │ │ ├── Test2.java │ │ └── ThreadException.java │ │ ├── chapter10 │ │ ├── Lock.java │ │ └── SynchronizedProblem.java │ │ ├── chapter7 │ │ ├── BankVersion3.java │ │ ├── BankVersion2.java │ │ ├── SychronizedStaticTest.java │ │ ├── SynchronizedTEst.java │ │ └── TicketWindowRunnable.java │ │ ├── chapter8 │ │ ├── DeadLock.java │ │ ├── OtherService.java │ │ └── DeadLockTest.java │ │ ├── chapter3 │ │ ├── CreateThread3.java │ │ ├── CreateThread4.java │ │ └── CreateThread.java │ │ ├── chapter4 │ │ └── ThreadSimpleAPI.java │ │ └── chapter6 │ │ ├── ThreadCloseForce.java │ │ ├── ThreadCloseGraceful.java │ │ └── ThreadCloseGraceful2.java ├── pom.xml └── sharing.iml ├── book ├── src │ └── main │ │ └── java │ │ └── com │ │ └── wangwenjun │ │ └── concurrent │ │ ├── chapter27 │ │ ├── ActiveService.java │ │ ├── IllegalActiveMethod.java │ │ ├── OrderService.java │ │ ├── ActiveFuture.java │ │ ├── OrderServiceFactory.java │ │ ├── MethodMessage.java │ │ ├── ActiveMethod.java │ │ ├── ActiveDaemonThread.java │ │ ├── OrderMessage.java │ │ ├── ActiveOrderServiceTest.java │ │ └── FindOrderDetailsMessage.java │ │ ├── chapter19 │ │ ├── Task.java │ │ ├── Callback.java │ │ ├── Future.java │ │ ├── FutureService.java │ │ ├── FutureTest.java │ │ └── FutureTask.java │ │ ├── chapter15 │ │ ├── Task.java │ │ ├── Observable.java │ │ ├── TaskLifecycle.java │ │ └── ObservableThreadTest.java │ │ ├── chapter29 │ │ ├── Channel.java │ │ ├── Event.java │ │ ├── UserOfflineEvent.java │ │ ├── MessageMatcherException.java │ │ ├── DynamicRouter.java │ │ ├── User.java │ │ ├── Message.java │ │ ├── UserOnlineEvent.java │ │ ├── UserOnlineEventChannel.java │ │ ├── UserChatEventChannel.java │ │ ├── UserOfflineEventChannel.java │ │ ├── UserChatEvent.java │ │ ├── InputEvent.java │ │ ├── UserChatApplication.java │ │ ├── AsyncChannel.java │ │ ├── EventDispatcher.java │ │ └── UserChatThread.java │ │ ├── chapter08 │ │ ├── ThreadFactory.java │ │ ├── RunnableQueue.java │ │ ├── RunnableDenyException.java │ │ ├── ThreadPool.java │ │ ├── InternalTask.java │ │ └── DenyPolicy.java │ │ ├── chapter25 │ │ ├── CacheLoader.java │ │ └── Reference.java │ │ ├── chapter17 │ │ ├── Lock.java │ │ └── ReadWriteLock.java │ │ ├── chapter03 │ │ ├── FightQuery.java │ │ ├── TimeUnitExample.java │ │ ├── ThreadYield.java │ │ ├── CurrentThread.java │ │ ├── Threadinterrupted.java │ │ ├── ThreadSleep.java │ │ ├── FlagThreadExit.java │ │ └── YieldVsSleep.java │ │ ├── chapter01 │ │ ├── RowHandler.java │ │ ├── DuplicatedStartThread.java │ │ └── RecordQuery.java │ │ ├── chapter22 │ │ ├── BalkingTest.java │ │ └── AutoSaveThread.java │ │ ├── chapter23 │ │ ├── WaitTimeoutException.java │ │ └── Latch.java │ │ ├── chapter10 │ │ ├── Test.java │ │ ├── LoadString.java │ │ ├── HelloWorld.java │ │ ├── BootStrapClassLoader.java │ │ ├── ApplicationClassLoader.java │ │ ├── ExtClassLoader.java │ │ ├── RuntimePackage.java │ │ ├── BrokenDelegateClassLoaderTest.java │ │ ├── SimpleClass.java │ │ ├── LoadSimpleClass.java │ │ └── NameSpace.java │ │ ├── chapter21 │ │ ├── Configuration.java │ │ ├── OtherResource.java │ │ ├── RuntimeInfo.java │ │ ├── ApplicationConfiguration.java │ │ ├── ActionContextExample.java │ │ └── ActionContext.java │ │ ├── chapter24 │ │ ├── Request.java │ │ ├── ChatServerTest.java │ │ ├── Client.java │ │ ├── Operator.java │ │ └── TaskHandler.java │ │ ├── chapter26 │ │ ├── InstructionBook.java │ │ ├── Production.java │ │ └── Worker.java │ │ ├── chapter28 │ │ ├── EventExceptionHandler.java │ │ ├── monitor │ │ │ └── TargetMonitor.java │ │ ├── FileChangeListener.java │ │ ├── EventContext.java │ │ ├── SimpleSubscriber1.java │ │ ├── SimpleSubscriber2.java │ │ ├── Bus.java │ │ ├── Subscribe.java │ │ ├── FileChangeEvent.java │ │ ├── EventBusExample.java │ │ ├── AsyncEventBus.java │ │ └── Subscriber.java │ │ ├── chapter16 │ │ ├── Tableware.java │ │ ├── EatTest.java │ │ ├── TablewarePair.java │ │ └── FlightSecurity.java │ │ ├── chapter09 │ │ ├── LinkedPrepare.java │ │ ├── Parent.java │ │ ├── ClassResolve.java │ │ ├── Simple.java │ │ ├── Child.java │ │ ├── GlobalConstants.java │ │ ├── ActiveLoadTest.java │ │ ├── ClassInit.java │ │ └── Singleton.java │ │ ├── chapter05 │ │ ├── Lock.java │ │ ├── WaitNotify.java │ │ ├── SynchronizedDefect.java │ │ └── EventClient.java │ │ ├── chapter04 │ │ ├── SynchronizedBasic.java │ │ ├── ApiDeadLock.java │ │ ├── API.java │ │ ├── Mutex.java │ │ ├── TicketWindowRunnable.java │ │ └── HashMapDeadLock.java │ │ ├── chapter18 │ │ ├── Immutable.java │ │ ├── ArrayListStream.java │ │ └── ShareData.java │ │ ├── chapter06 │ │ ├── ThreadGroupCreator.java │ │ ├── ThreadGroupDestroy.java │ │ ├── ThreadGroupEnumerateThreadGroups.java │ │ └── ThreadGroupEnumerateThreads.java │ │ ├── chapter11 │ │ └── MainThreadClassLoader.java │ │ ├── chapter14 │ │ └── Singleton.java │ │ ├── chapter02 │ │ ├── DaemonThread.java │ │ └── ThreadCounter.java │ │ ├── chapter07 │ │ ├── CaptureThreadException.java │ │ └── EmptyExceptionHandler.java │ │ └── chapter20 │ │ └── GuardedSuspensionQueue.java ├── pom.xml └── book.iml ├── test ├── src │ └── main │ │ └── java │ │ └── java │ │ └── lang │ │ └── String.java ├── test.iml └── pom.xml ├── classLoader ├── src │ └── main │ │ └── java │ │ └── com │ │ └── wangwenjun │ │ └── concurrent │ │ └── classloader │ │ ├── chapter5 │ │ ├── SimpleObject.java │ │ ├── SimpleClassLoaderTest.java │ │ ├── Namespace.java │ │ └── RuntimePackage.java │ │ ├── chapter2 │ │ ├── SimpleObject.java │ │ └── BootClassLoader.java │ │ ├── chapter1 │ │ ├── SimpleInterface.java │ │ └── ClinitThreadTest.java │ │ ├── chapter4 │ │ ├── ClassLoaderTest.java │ │ └── SimpleEncrypt.java │ │ ├── chapter6 │ │ └── ThreadContextClassLoader.java │ │ └── chapter3 │ │ └── MyClassLoaderTest2.java └── pom.xml ├── design_pattern ├── src │ └── main │ │ └── java │ │ └── com │ │ └── wangwenjun │ │ └── concurrent │ │ ├── chapter8 │ │ ├── FutureTask.java │ │ ├── Future.java │ │ ├── AsynFuture.java │ │ └── FutureService.java │ │ ├── chapter18 │ │ ├── Result.java │ │ ├── ActiveObject.java │ │ ├── RealResult.java │ │ ├── DisplayStringRequest.java │ │ ├── MethodRequest.java │ │ ├── Test.java │ │ ├── ActiveObjectFactory.java │ │ ├── SchedulerThread.java │ │ ├── MakeStringRequest.java │ │ ├── FutureResult.java │ │ ├── DisplayClientThread.java │ │ ├── Servant.java │ │ ├── ActiveObjectProxy.java │ │ └── MakerClientThread.java │ │ ├── chapter4 │ │ ├── LifeCycleListener.java │ │ ├── ThreadLifeCycleClient.java │ │ ├── Observer.java │ │ ├── OctalObserver.java │ │ ├── BinaryObserver.java │ │ ├── ObserverClient.java │ │ └── Subject.java │ │ ├── chapter13 │ │ ├── Message.java │ │ ├── ProducerAndConsumerClient.java │ │ └── ConsumerThread.java │ │ ├── chapter15 │ │ ├── Message.java │ │ └── PerThreadClient.java │ │ ├── chapter9 │ │ ├── Request.java │ │ ├── SuspensionClient.java │ │ ├── RequestQueue.java │ │ └── ClientThread.java │ │ ├── chapter11 │ │ ├── ContextTest.java │ │ ├── QueryFromDBAction.java │ │ ├── Context.java │ │ ├── QueryFromHttpAction.java │ │ ├── ExecutionTask.java │ │ └── ActionContext.java │ │ ├── chapter16 │ │ ├── CounterTest.java │ │ └── AppServerClient.java │ │ ├── chapter7 │ │ ├── StringTest.java │ │ ├── ImmutableClient.java │ │ ├── UsePersonThread.java │ │ ├── Person.java │ │ └── ImmutableTest.java │ │ ├── chapter1 │ │ ├── SingletonObject1.java │ │ ├── SingletonObject6.java │ │ ├── SingletonObject2.java │ │ ├── SingletonObject3.java │ │ ├── SingletonObject4.java │ │ └── SingletonObject5.java │ │ ├── chapter12 │ │ ├── BalkingClient.java │ │ ├── WaiterThread.java │ │ └── CustomerThread.java │ │ ├── chapter17 │ │ ├── WorkerClient.java │ │ ├── Request.java │ │ ├── WorkerThread.java │ │ └── TransportThread.java │ │ ├── chapter5 │ │ ├── Client.java │ │ ├── User.java │ │ └── Gate.java │ │ ├── chapter10 │ │ ├── ThreadLocalSimpleTest.java │ │ └── ThreadLocalSimulator.java │ │ ├── chapter14 │ │ └── CountDown.java │ │ └── chapter6 │ │ ├── ReaderWorker.java │ │ └── ReadWritLockClient.java ├── pom.xml └── design_pattern.iml ├── jcu ├── pom.xml └── jcu.iml ├── example ├── pom.xml ├── example.iml └── src │ └── main │ └── java │ └── com │ └── wangwenjun │ └── concurrency │ └── CreateThreadGroup.java ├── jcuexample ├── src │ └── main │ │ └── java │ │ └── com │ │ └── wangwenjun │ │ └── atomic │ │ └── AtomicCompareTest.java ├── jcuexample.iml └── pom.xml └── java-concurrency.iml /.idea/.name: -------------------------------------------------------------------------------- 1 | java-concurrency -------------------------------------------------------------------------------- /.idea/copyright/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /sharing/image2017-3-9 16-16-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangwenjun/java-concurrency/HEAD/sharing/image2017-3-9 16-16-16.png -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter27/ActiveService.java: -------------------------------------------------------------------------------- 1 | //package com.wangwenjun.concurrent.chapter27; 2 | // 3 | //public interface ActiveService 4 | //{ 5 | //} -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter19/Task.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter19; 2 | public interface Task 3 | { 4 | OUT get(IN input); 5 | } 6 | -------------------------------------------------------------------------------- /.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter15/Task.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter15; 2 | 3 | @FunctionalInterface 4 | public interface Task 5 | { 6 | T call(); 7 | } 8 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter19/Callback.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter19; 2 | 3 | @FunctionalInterface 4 | public interface Callback 5 | { 6 | void call(T t); 7 | } -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter29/Channel.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter29; 2 | 3 | public interface Channel 4 | { 5 | void dispatch(E message); 6 | } 7 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter08/ThreadFactory.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter08; 2 | 3 | public interface ThreadFactory 4 | { 5 | Thread createThread(Runnable runnable); 6 | } 7 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter25/CacheLoader.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter25; 2 | 3 | @FunctionalInterface 4 | public interface CacheLoader 5 | { 6 | V load(K k); 7 | } 8 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter17/Lock.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter17; 2 | 3 | public interface Lock 4 | { 5 | 6 | void lock() throws InterruptedException; 7 | 8 | void unlock(); 9 | } -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter19/Future.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter19; 2 | 3 | public interface Future 4 | { 5 | T get() throws InterruptedException; 6 | 7 | boolean done(); 8 | } -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter03/FightQuery.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter03; 2 | 3 | import java.util.List; 4 | 5 | public interface FightQuery 6 | { 7 | 8 | List get(); 9 | } 10 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter01/RowHandler.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter01; 2 | 3 | import java.sql.ResultSet; 4 | 5 | public interface RowHandler 6 | { 7 | 8 | T handle(ResultSet rs); 9 | } 10 | -------------------------------------------------------------------------------- /.idea/kotlinc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | -------------------------------------------------------------------------------- /test/src/main/java/java/lang/String.java: -------------------------------------------------------------------------------- 1 | package java.lang; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/4/4 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public class String { 9 | } -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter29/Event.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter29; 2 | 3 | public class Event implements Message 4 | { 5 | @Override 6 | public Class getType() 7 | { 8 | return getClass(); 9 | } 10 | } -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter29/UserOfflineEvent.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter29; 2 | 3 | public class UserOfflineEvent extends UserOnlineEvent 4 | { 5 | public UserOfflineEvent(User user) 6 | { 7 | super(user); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter08/RunnableQueue.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter08; 2 | 3 | public interface RunnableQueue 4 | { 5 | 6 | void offer(Runnable runnable); 7 | 8 | Runnable take() throws InterruptedException; 9 | 10 | int size(); 11 | } 12 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter22/BalkingTest.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter22; 2 | 3 | public class BalkingTest 4 | { 5 | public static void main(String[] args) 6 | { 7 | new DocumentEditThread("G:\\", "balking.txt").start(); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter23/WaitTimeoutException.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter23; 2 | 3 | public class WaitTimeoutException extends Exception 4 | { 5 | public WaitTimeoutException(String message) 6 | { 7 | super(message); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter29/MessageMatcherException.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter29; 2 | 3 | public class MessageMatcherException extends RuntimeException 4 | { 5 | public MessageMatcherException(String message) 6 | { 7 | super(message); 8 | } 9 | } -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter08/RunnableDenyException.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter08; 2 | 3 | public class RunnableDenyException extends RuntimeException 4 | { 5 | 6 | public RunnableDenyException(String message) 7 | { 8 | super(message); 9 | } 10 | } -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter10/Test.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter10; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/11/21 6 | * QQ: 532500648 7 | * QQ群:463962286 8 | ***************************************/ 9 | public class Test 10 | { 11 | } 12 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter29/DynamicRouter.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter29; 2 | 3 | public interface DynamicRouter 4 | { 5 | void registerChannel(Class messageType, 6 | Channel channel); 7 | 8 | void dispatch(E message); 9 | } -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter15/Observable.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter15; 2 | 3 | public interface Observable 4 | { 5 | enum Cycle 6 | { 7 | STARTED, RUNNING, DONE, ERROR 8 | } 9 | 10 | Cycle getCycle(); 11 | 12 | void start(); 13 | 14 | void interrupt(); 15 | } 16 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter21/Configuration.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter21; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/12/9 6 | * QQ: 532500648 7 | * QQ群:463962286 8 | ***************************************/ 9 | public class Configuration 10 | { 11 | } 12 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter21/OtherResource.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter21; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/12/9 6 | * QQ: 532500648 7 | * QQ群:463962286 8 | ***************************************/ 9 | public class OtherResource 10 | { 11 | } 12 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter21/RuntimeInfo.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter21; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/12/7 6 | * QQ: 532500648 7 | * QQ群:463962286 8 | ***************************************/ 9 | public class RuntimeInfo 10 | { 11 | } 12 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter29/User.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter29; 2 | 3 | public class User 4 | { 5 | private final String name; 6 | 7 | public User(String name) 8 | { 9 | this.name = name; 10 | } 11 | 12 | public String getName() 13 | { 14 | return name; 15 | } 16 | } -------------------------------------------------------------------------------- /classLoader/src/main/java/com/wangwenjun/concurrent/classloader/chapter5/SimpleObject.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.classloader.chapter5; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/4/4 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public class SimpleObject { 9 | } 10 | -------------------------------------------------------------------------------- /classLoader/src/main/java/com/wangwenjun/concurrent/classloader/chapter2/SimpleObject.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.classloader.chapter2; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/4/2 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public class SimpleObject { 9 | 10 | } 11 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter21/ApplicationConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter21; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/12/7 6 | * QQ: 532500648 7 | * QQ群:463962286 8 | ***************************************/ 9 | public class ApplicationConfiguration 10 | { 11 | } 12 | -------------------------------------------------------------------------------- /design_pattern/src/main/java/com/wangwenjun/concurrent/chapter8/FutureTask.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter8; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/3/22 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public interface FutureTask { 9 | 10 | T call(); 11 | } 12 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter25/Reference.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter25; 2 | 3 | public class Reference 4 | { 5 | //1M 6 | private final byte[] data = new byte[2 << 19]; 7 | 8 | @Override 9 | protected void finalize() throws Throwable 10 | { 11 | System.out.println("the reference will be GC."); 12 | } 13 | } -------------------------------------------------------------------------------- /classLoader/src/main/java/com/wangwenjun/concurrent/classloader/chapter1/SimpleInterface.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.classloader.chapter1; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/4/2 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public class SimpleInterface { 9 | 10 | } 11 | -------------------------------------------------------------------------------- /design_pattern/src/main/java/com/wangwenjun/concurrent/chapter18/Result.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter18; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/3/26 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public interface Result { 9 | 10 | Object getResultValue(); 11 | 12 | } -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter29/Message.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter29; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/12/10 6 | * QQ: 532500648 7 | * QQ群:463962286 8 | ***************************************/ 9 | public interface Message 10 | { 11 | Class getType(); 12 | } 13 | -------------------------------------------------------------------------------- /design_pattern/src/main/java/com/wangwenjun/concurrent/chapter8/Future.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter8; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/3/22 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public interface Future { 9 | 10 | T get() throws InterruptedException; 11 | 12 | } -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter29/UserOnlineEvent.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter29; 2 | 3 | public class UserOnlineEvent extends Event 4 | { 5 | private final User user; 6 | 7 | public UserOnlineEvent(User user) 8 | { 9 | this.user = user; 10 | } 11 | 12 | public User getUser() 13 | { 14 | return user; 15 | } 16 | } -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter24/Request.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter24; 2 | 3 | public class Request 4 | { 5 | private final String business; 6 | 7 | public Request(String business) 8 | { 9 | this.business = business; 10 | } 11 | 12 | @Override 13 | public String toString() 14 | { 15 | return business; 16 | } 17 | } -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter26/InstructionBook.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter26; 2 | 3 | public abstract class InstructionBook 4 | { 5 | public final void create() 6 | { 7 | this.firstProcess(); 8 | this.secondProcess(); 9 | } 10 | 11 | protected abstract void firstProcess(); 12 | 13 | protected abstract void secondProcess(); 14 | } -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter28/EventExceptionHandler.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter28; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/10/21 6 | * 532500648 7 | ***************************************/ 8 | public interface EventExceptionHandler 9 | { 10 | void handle(Throwable cause, EventContext context); 11 | } 12 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter16/Tableware.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter16; 2 | 3 | public class Tableware 4 | { 5 | private final String toolName; 6 | 7 | public Tableware(String toolName) 8 | { 9 | this.toolName = toolName; 10 | } 11 | 12 | @Override 13 | public String toString() 14 | { 15 | return "Tool:" + toolName; 16 | } 17 | } -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter09/LinkedPrepare.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter09; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/11/19 6 | * QQ: 532500648 7 | * QQ群:463962286 8 | ***************************************/ 9 | public class LinkedPrepare 10 | { 11 | private static int a = 10; 12 | private final static int b = 10; 13 | } 14 | -------------------------------------------------------------------------------- /design_pattern/src/main/java/com/wangwenjun/concurrent/chapter4/LifeCycleListener.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter4; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/3/18 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public interface LifeCycleListener { 9 | 10 | void onEvent(ObservableRunnable.RunnableEvent event); 11 | } 12 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter08/ThreadPool.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter08; 2 | 3 | public interface ThreadPool 4 | { 5 | 6 | void execute(Runnable runnable); 7 | 8 | void shutdown(); 9 | 10 | int getInitSize(); 11 | 12 | int getMaxSize(); 13 | 14 | int getCoreSize(); 15 | 16 | int getQueueSize(); 17 | 18 | int getActiveCount(); 19 | 20 | boolean isShutdown(); 21 | } -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter19/FutureService.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter19; 2 | 3 | public interface FutureService 4 | { 5 | Future submit(Runnable runnable); 6 | 7 | Future submit(Task task, IN input,Callback callback); 8 | 9 | static FutureService newService() 10 | { 11 | return new FutureServiceImpl<>(); 12 | } 13 | 14 | } -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter29/UserOnlineEventChannel.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter29; 2 | 3 | public class UserOnlineEventChannel extends AsyncChannel 4 | { 5 | @Override 6 | protected void handle(Event message) 7 | { 8 | UserOnlineEvent event = (UserOnlineEvent) message; 9 | System.out.println("The User[" + event.getUser().getName() + "] is online."); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter10/LoadString.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter10; 2 | 3 | public class LoadString 4 | { 5 | public static void main(String[] args) 6 | throws ClassNotFoundException 7 | { 8 | BrokerDelegateClassLoader classLoader = new BrokerDelegateClassLoader("G:\\classloader3"); 9 | Class aClass = classLoader.loadClass("java.lang.String"); 10 | } 11 | } -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter28/monitor/TargetMonitor.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter28.monitor; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/10/19 6 | * 532500648 7 | ***************************************/ 8 | public interface TargetMonitor 9 | { 10 | 11 | void startMonitor() throws Exception; 12 | 13 | void stopMonitor() throws Exception; 14 | } 15 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter29/UserChatEventChannel.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter29; 2 | 3 | public class UserChatEventChannel extends AsyncChannel 4 | { 5 | @Override 6 | protected void handle(Event message) 7 | { 8 | UserChatEvent event = (UserChatEvent) message; 9 | System.out.println("The User[" + event.getUser().getName() + "] say: " + event.getMessage()); 10 | } 11 | } -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter29/UserOfflineEventChannel.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter29; 2 | 3 | public class UserOfflineEventChannel extends AsyncChannel 4 | { 5 | @Override 6 | protected void handle(Event message) 7 | { 8 | UserOfflineEvent event = (UserOfflineEvent) message; 9 | System.out.println("The User[" + event.getUser().getName() + "] is offline."); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /sharing/src/main/java/com/wangwenjun/concurrency/chapter2/CalculatorStrategy.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrency.chapter2; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/2/15 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | 9 | @FunctionalInterface 10 | public interface CalculatorStrategy { 11 | 12 | double calculate(double salary, double bonus); 13 | } 14 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter05/Lock.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter05; 2 | 3 | import java.util.List; 4 | import java.util.concurrent.TimeoutException; 5 | 6 | public interface Lock 7 | { 8 | 9 | void lock() throws InterruptedException; 10 | 11 | void lock(long mills) throws InterruptedException, TimeoutException; 12 | 13 | void unlock(); 14 | 15 | List getBlockedThreads(); 16 | } 17 | -------------------------------------------------------------------------------- /sharing/src/main/java/com/wangwenjun/concurrency/chapter11/Test1.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrency.chapter11; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/2/24 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public class Test1 9 | { 10 | 11 | private Test2 test2 = new Test2(); 12 | 13 | public void test(){ 14 | test2.test(); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter10/HelloWorld.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter10; 2 | 3 | public class HelloWorld 4 | { 5 | static 6 | { 7 | Test test = new Test(); 8 | System.out.println(test.getClass().getClassLoader()); 9 | System.out.println("Hello World Class is Initialized."); 10 | } 11 | 12 | public String welcome() 13 | { 14 | return "Hello World"; 15 | } 16 | } -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter29/UserChatEvent.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter29; 2 | 3 | public class UserChatEvent extends UserOnlineEvent 4 | { 5 | private final String message; 6 | 7 | public UserChatEvent(User user, String message) 8 | { 9 | super(user); 10 | this.message = message; 11 | } 12 | 13 | public String getMessage() 14 | { 15 | return message; 16 | } 17 | } -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter04/SynchronizedBasic.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter04; 2 | 3 | 4 | public class SynchronizedBasic 5 | { 6 | 7 | 8 | private final Object MUTEX = new Object(); 9 | 10 | public void sync() 11 | { 12 | synchronized (MUTEX) 13 | { 14 | 15 | } 16 | } 17 | 18 | 19 | public synchronized static void staticSync() 20 | { 21 | 22 | } 23 | 24 | 25 | } 26 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter09/Parent.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter09; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/11/19 6 | * QQ: 532500648 7 | * QQ群:463962286 8 | ***************************************/ 9 | public class Parent 10 | { 11 | static 12 | { 13 | System.out.println("The parent is initialized"); 14 | } 15 | 16 | public static int y=100; 17 | } 18 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter27/IllegalActiveMethod.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter27; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/12/6 6 | * QQ: 532500648 7 | * QQ群:463962286 8 | ***************************************/ 9 | public class IllegalActiveMethod extends Exception 10 | { 11 | public IllegalActiveMethod(String message) 12 | { 13 | super(message); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter18/Immutable.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter18; 2 | 3 | import java.util.List; 4 | 5 | public final class Immutable 6 | { 7 | private final List list; 8 | 9 | public Immutable(List list) 10 | { 11 | this.list = list; 12 | } 13 | 14 | public List getList() 15 | { 16 | //Collections.unmodifiableList(this.list) 17 | return this.list; 18 | } 19 | } -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter29/InputEvent.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter29; 2 | 3 | public class InputEvent extends Event 4 | { 5 | private final int x; 6 | private final int y; 7 | 8 | public InputEvent(int x, int y) 9 | { 10 | this.x = x; 11 | this.y = y; 12 | } 13 | 14 | public int getX() 15 | { 16 | return x; 17 | } 18 | 19 | public int getY() 20 | { 21 | return y; 22 | } 23 | } -------------------------------------------------------------------------------- /design_pattern/src/main/java/com/wangwenjun/concurrent/chapter18/ActiveObject.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter18; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/3/26 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | 9 | /** 10 | * 接受异步消息的主动对象 11 | */ 12 | public interface ActiveObject { 13 | 14 | Result makeString(int count,char fillChar); 15 | 16 | void displayString(String text); 17 | } 18 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter28/FileChangeListener.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter28; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/10/19 6 | * 532500648 7 | ***************************************/ 8 | public class FileChangeListener 9 | { 10 | @Subscribe 11 | public void onChange(FileChangeEvent event) 12 | { 13 | System.out.printf("%s-%s\n", event.getPath(), event.getKind()); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter09/ClassResolve.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter09; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/11/20 6 | * QQ: 532500648 7 | * QQ群:463962286 8 | ***************************************/ 9 | public class ClassResolve 10 | { 11 | static Simple simple = new Simple(); 12 | 13 | public static void main(String[] args) 14 | { 15 | System.out.println(simple); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter03/TimeUnitExample.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter03; 2 | 3 | import java.util.concurrent.TimeUnit; 4 | 5 | public class TimeUnitExample 6 | { 7 | public static void main(String[] args) throws InterruptedException 8 | { 9 | Thread.sleep(12257088L); 10 | 11 | TimeUnit.HOURS.sleep(3); 12 | TimeUnit.MINUTES.sleep(24); 13 | TimeUnit.SECONDS.sleep(17); 14 | TimeUnit.MILLISECONDS.sleep(88); 15 | } 16 | } -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter28/EventContext.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter28; 2 | 3 | import java.lang.reflect.Method; 4 | 5 | /*************************************** 6 | * @author:Alex Wang 7 | * @Date:2017/10/21 8 | * 532500648 9 | ***************************************/ 10 | public interface EventContext 11 | { 12 | 13 | String getSource(); 14 | 15 | Object getSubscriber(); 16 | 17 | Method getSubscribe(); 18 | 19 | Object getEvent(); 20 | } 21 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter28/SimpleSubscriber1.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter28; 2 | 3 | public class SimpleSubscriber1 4 | { 5 | @Subscribe 6 | public void method1(String message) 7 | { 8 | System.out.println("==SimpleSubscriber1==method1==" + message); 9 | } 10 | 11 | @Subscribe(topic = "test") 12 | public void method2(String message) 13 | { 14 | System.out.println("==SimpleSubscriber1==method2==" + message); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter28/SimpleSubscriber2.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter28; 2 | 3 | public class SimpleSubscriber2 4 | { 5 | @Subscribe 6 | public void method1(String message) 7 | { 8 | System.out.println("==SimpleSubscriber2==method1==" + message); 9 | } 10 | 11 | @Subscribe(topic = "test") 12 | public void method2(String message) 13 | { 14 | System.out.println("==SimpleSubscriber2==method2==" + message); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /design_pattern/src/main/java/com/wangwenjun/concurrent/chapter13/Message.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter13; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/3/24 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public class Message { 9 | private String data; 10 | 11 | public Message(String data) { 12 | this.data = data; 13 | } 14 | 15 | public String getData() { 16 | return data; 17 | } 18 | } -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter24/ChatServerTest.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter24; 2 | 3 | import java.io.IOException; 4 | 5 | /*************************************** 6 | * @author:Alex Wang 7 | * @Date:2017/11/28 8 | * QQ: 532500648 9 | * QQ群:463962286 10 | ***************************************/ 11 | public class ChatServerTest 12 | { 13 | public static void main(String[] args) throws IOException 14 | { 15 | new ChatServer().startServer(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter27/OrderService.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter27; 2 | 3 | import com.wangwenjun.concurrent.chapter19.Future; 4 | 5 | /*************************************** 6 | * @author:Alex Wang 7 | * @Date:2017/12/3 8 | * QQ: 532500648 9 | * QQ群:463962286 10 | ***************************************/ 11 | public interface OrderService 12 | { 13 | Future findOrderDetails(long orderId); 14 | 15 | void order(String account, long orderId); 16 | } 17 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter18/ArrayListStream.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter18; 2 | 3 | import java.util.Arrays; 4 | import java.util.List; 5 | 6 | public class ArrayListStream 7 | { 8 | public static void main(String[] args) 9 | { 10 | List list = Arrays.asList("Java", "Thread", "Concurrency", "Scala", "Clojure"); 11 | list.parallelStream().map(String::toUpperCase).forEach(System.out::println); 12 | list.forEach(System.out::println); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /design_pattern/src/main/java/com/wangwenjun/concurrent/chapter15/Message.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter15; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/3/24 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public class Message { 9 | private final String value; 10 | 11 | public Message(String value) { 12 | this.value = value; 13 | } 14 | 15 | public String getValue() { 16 | return value; 17 | } 18 | } -------------------------------------------------------------------------------- /design_pattern/src/main/java/com/wangwenjun/concurrent/chapter4/ThreadLifeCycleClient.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter4; 2 | 3 | import java.util.Arrays; 4 | 5 | /*************************************** 6 | * @author:Alex Wang 7 | * @Date:2017/3/18 QQ:532500648 8 | * QQ交流群:286081824 9 | ***************************************/ 10 | public class ThreadLifeCycleClient { 11 | public static void main(String[] args) { 12 | new ThreadLifeCycleObserver().concurrentQuery(Arrays.asList("1", "2")); 13 | } 14 | } -------------------------------------------------------------------------------- /design_pattern/src/main/java/com/wangwenjun/concurrent/chapter9/Request.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter9; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/3/23 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public class Request { 9 | final private String value; 10 | 11 | public Request(String value) { 12 | this.value = value; 13 | } 14 | 15 | public String getValue() { 16 | return value; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter24/Client.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter24; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/11/28 6 | * QQ: 532500648 7 | * QQ群:463962286 8 | ***************************************/ 9 | public class Client 10 | { 11 | public static void main(String[] args) 12 | { 13 | Operator operator = new Operator(); 14 | operator.call("complaints"); 15 | operator.call("transfer business"); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter27/ActiveFuture.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter27; 2 | 3 | import com.wangwenjun.concurrent.chapter19.FutureTask; 4 | 5 | /*************************************** 6 | * @author:Alex Wang 7 | * @Date:2017/12/4 8 | * QQ: 532500648 9 | * QQ群:463962286 10 | ***************************************/ 11 | public class ActiveFuture extends FutureTask 12 | { 13 | @Override 14 | public void finish(T result) 15 | { 16 | super.finish(result); 17 | } 18 | } -------------------------------------------------------------------------------- /test/test.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter27/OrderServiceFactory.java: -------------------------------------------------------------------------------- 1 | //package com.wangwenjun.concurrent.chapter27; 2 | // 3 | //public final class OrderServiceFactory 4 | //{ 5 | // private final static ActiveMessageQueue activeMessageQueue = new ActiveMessageQueue(); 6 | // 7 | // private OrderServiceFactory() 8 | // { 9 | // } 10 | // 11 | // public static OrderService toActiveObject(OrderService orderService) 12 | // { 13 | // return new OrderServiceProxy(orderService, activeMessageQueue); 14 | // } 15 | //} 16 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter24/Operator.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter24; 2 | 3 | import com.wangwenjun.concurrent.chapter08.BasicThreadPool; 4 | import com.wangwenjun.concurrent.chapter08.ThreadPool; 5 | 6 | public class Operator 7 | { 8 | private final ThreadPool threadPool = new BasicThreadPool(2, 6, 4, 1000); 9 | 10 | public void call(String business) 11 | { 12 | TaskHandler taskHandler = new TaskHandler(new Request(business)); 13 | threadPool.execute(taskHandler); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter28/Bus.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter28; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/10/21 6 | * 532500648 7 | ***************************************/ 8 | public interface Bus 9 | { 10 | 11 | void register(Object subscriber); 12 | 13 | void unregister(Object subscriber); 14 | 15 | void post(Object event); 16 | 17 | void post(Object Event, String topic); 18 | 19 | void close(); 20 | 21 | String getBusName(); 22 | } 23 | -------------------------------------------------------------------------------- /design_pattern/src/main/java/com/wangwenjun/concurrent/chapter4/Observer.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter4; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/3/18 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public abstract class Observer { 9 | 10 | protected Subject subject; 11 | 12 | public Observer(Subject subject) { 13 | this.subject = subject; 14 | this.subject.attach(this); 15 | } 16 | 17 | public abstract void update(); 18 | 19 | } 20 | -------------------------------------------------------------------------------- /jcu/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | java-concurrency 7 | java-concurrency 8 | 1.0-SNAPSHOT 9 | 10 | 4.0.0 11 | 12 | jcu 13 | 14 | 15 | -------------------------------------------------------------------------------- /test/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | java-concurrency 7 | java-concurrency 8 | 1.0-SNAPSHOT 9 | 10 | 4.0.0 11 | 12 | test 13 | 14 | 15 | -------------------------------------------------------------------------------- /example/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | java-concurrency 7 | java-concurrency 8 | 1.0-SNAPSHOT 9 | 10 | 4.0.0 11 | 12 | example 13 | 14 | 15 | -------------------------------------------------------------------------------- /sharing/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | java-concurrency 7 | java-concurrency 8 | 1.0-SNAPSHOT 9 | 10 | 4.0.0 11 | 12 | sharing 13 | 14 | 15 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter09/Simple.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter09; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/11/19 6 | * QQ: 532500648 7 | * QQ群:463962286 8 | ***************************************/ 9 | public class Simple 10 | { 11 | static 12 | { 13 | System.out.println("I will be initialized"); 14 | } 15 | 16 | public static void main(String[] args) throws ClassNotFoundException 17 | { 18 | Simple[] simples = new Simple[10]; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter10/BootStrapClassLoader.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter10; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/11/20 6 | * QQ: 532500648 7 | * QQ群:463962286 8 | ***************************************/ 9 | public class BootStrapClassLoader 10 | { 11 | public static void main(String[] args) 12 | { 13 | System.out.println("Bootstrap:" + String.class.getClassLoader()); 14 | System.out.println(System.getProperty("sun.boot.class.path")); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter10/ApplicationClassLoader.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter10; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/11/20 6 | * QQ: 532500648 7 | * QQ群:463962286 8 | ***************************************/ 9 | public class ApplicationClassLoader 10 | { 11 | public static void main(String[] args) 12 | { 13 | System.out.println(System.getProperty("java.class.path")); 14 | System.out.println(ApplicationClassLoader.class.getClassLoader()); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter10/ExtClassLoader.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter10; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/11/20 6 | * QQ: 532500648 7 | * QQ群:463962286 8 | ***************************************/ 9 | public class ExtClassLoader 10 | { 11 | public static void main(String[] args) 12 | throws ClassNotFoundException 13 | { 14 | Class helloClass = Class.forName("Hello"); 15 | System.out.println(helloClass.getClassLoader()); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter27/MethodMessage.java: -------------------------------------------------------------------------------- 1 | //package com.wangwenjun.concurrent.chapter27; 2 | // 3 | //import java.util.Map; 4 | // 5 | //public abstract class MethodMessage 6 | //{ 7 | // protected final Map params; 8 | // 9 | // protected final OrderService orderService; 10 | // 11 | // public MethodMessage(Map params, OrderService orderService) 12 | // { 13 | // this.params = params; 14 | // this.orderService = orderService; 15 | // } 16 | // 17 | // public abstract void execute(); 18 | //} 19 | -------------------------------------------------------------------------------- /classLoader/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | java-concurrency 7 | java-concurrency 8 | 1.0-SNAPSHOT 9 | 10 | 4.0.0 11 | 12 | classLoader 13 | 14 | 15 | -------------------------------------------------------------------------------- /design_pattern/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | java-concurrency 7 | java-concurrency 8 | 1.0-SNAPSHOT 9 | 10 | 4.0.0 11 | 12 | design_pattern 13 | 14 | 15 | -------------------------------------------------------------------------------- /design_pattern/src/main/java/com/wangwenjun/concurrent/chapter11/ContextTest.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter11; 2 | 3 | import java.util.stream.IntStream; 4 | 5 | /*************************************** 6 | * @author:Alex Wang 7 | * @Date:2017/3/23 QQ:532500648 8 | * QQ交流群:286081824 9 | ***************************************/ 10 | public class ContextTest { 11 | public static void main(String[] args) { 12 | IntStream.range(1, 5) 13 | .forEach(i -> 14 | new Thread(new ExecutionTask()).start() 15 | ); 16 | } 17 | } -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter27/ActiveMethod.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter27; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | /*************************************** 9 | * @author:Alex Wang 10 | * @Date:2017/12/5 11 | * QQ: 532500648 12 | * QQ群:463962286 13 | ***************************************/ 14 | @Retention(RetentionPolicy.RUNTIME) 15 | @Target(ElementType.METHOD) 16 | public @interface ActiveMethod 17 | { 18 | } 19 | -------------------------------------------------------------------------------- /design_pattern/src/main/java/com/wangwenjun/concurrent/chapter4/OctalObserver.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter4; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/3/18 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public class OctalObserver extends Observer { 9 | 10 | public OctalObserver(Subject subject) { 11 | super(subject); 12 | } 13 | 14 | @Override 15 | public void update() { 16 | System.out.println("Octal String:" + Integer.toOctalString(subject.getState())); 17 | } 18 | } -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter06/ThreadGroupCreator.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter06; 2 | 3 | public class ThreadGroupCreator 4 | { 5 | public static void main(String[] args) 6 | { 7 | ThreadGroup currentGroup = Thread.currentThread().getThreadGroup(); 8 | 9 | ThreadGroup group1 = new ThreadGroup("Group1"); 10 | 11 | System.out.println(group1.getParent() == currentGroup); 12 | 13 | ThreadGroup group2 = new ThreadGroup(group1, "Group2"); 14 | 15 | System.out.println(group2.getParent() == group1); 16 | 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter09/Child.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter09; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/11/19 6 | * QQ: 532500648 7 | * QQ群:463962286 8 | ***************************************/ 9 | public class Child extends Parent 10 | { 11 | static 12 | { 13 | System.out.println("The child will be initialized"); 14 | } 15 | 16 | public static int x = 10; 17 | 18 | public int test(){ 19 | return 0; 20 | } 21 | 22 | public void test(int x){ 23 | 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /design_pattern/src/main/java/com/wangwenjun/concurrent/chapter16/CounterTest.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter16; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/3/24 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public class CounterTest { 9 | public static void main(String[] args) throws InterruptedException { 10 | CounterIncrement counterIncrement = new CounterIncrement(); 11 | counterIncrement.start(); 12 | 13 | Thread.sleep(10_000L); 14 | counterIncrement.close(); 15 | } 16 | } -------------------------------------------------------------------------------- /design_pattern/src/main/java/com/wangwenjun/concurrent/chapter4/BinaryObserver.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter4; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/3/18 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public class BinaryObserver extends Observer { 9 | 10 | public BinaryObserver(Subject subject) { 11 | super(subject); 12 | } 13 | 14 | @Override 15 | public void update() { 16 | System.out.println("Binary String:" + Integer.toBinaryString(subject.getState())); 17 | } 18 | } -------------------------------------------------------------------------------- /design_pattern/src/main/java/com/wangwenjun/concurrent/chapter7/StringTest.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter7; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/3/22 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public class StringTest { 9 | public static void main(String[] args) { 10 | String s = "Hello"; 11 | String s2 = s.replace("l", "k"); 12 | System.out.println(s2.getClass() + " " + s2.hashCode()); 13 | System.out.println(s.getClass() + " " + s.hashCode()); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter09/GlobalConstants.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter09; 2 | 3 | import java.util.Random; 4 | 5 | /*************************************** 6 | * @author:Alex Wang 7 | * @Date:2017/11/19 8 | * QQ: 532500648 9 | * QQ群:463962286 10 | ***************************************/ 11 | public class GlobalConstants 12 | { 13 | static 14 | { 15 | System.out.println("The GlobalConstants will be initialized."); 16 | } 17 | 18 | public final static int MAX = 100; 19 | public final static int RANDOM = new Random().nextInt(); 20 | } 21 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter17/ReadWriteLock.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter17; 2 | 3 | public interface ReadWriteLock 4 | { 5 | 6 | Lock readLock(); 7 | 8 | Lock writeLock(); 9 | 10 | int getWritingWriters(); 11 | 12 | int getWaitingWriters(); 13 | 14 | int getReadingReaders(); 15 | 16 | static ReadWriteLock readWriteLock() 17 | { 18 | return new ReadWriteLockImpl(); 19 | } 20 | 21 | static ReadWriteLock readWriteLock(boolean preferWriter) 22 | { 23 | return new ReadWriteLockImpl(preferWriter); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter28/Subscribe.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter28; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | /*************************************** 9 | * @author:Alex Wang 10 | * @Date:2017/10/21 11 | * 532500648 12 | ***************************************/ 13 | @Retention(RetentionPolicy.RUNTIME) 14 | @Target(ElementType.METHOD) 15 | public @interface Subscribe 16 | { 17 | String topic() default "default-topic"; 18 | } 19 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter03/ThreadYield.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter03; 2 | 3 | import java.util.stream.IntStream; 4 | 5 | public class ThreadYield 6 | { 7 | public static void main(String[] args) 8 | { 9 | IntStream.range(0, 2).mapToObj(ThreadYield::create) 10 | .forEach(Thread::start); 11 | } 12 | 13 | private static Thread create(int index) 14 | { 15 | return new Thread(() -> 16 | { 17 | if (index == 0) 18 | Thread.yield(); 19 | System.out.println(index); 20 | }); 21 | } 22 | } -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter04/ApiDeadLock.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter04; 2 | 3 | import static java.lang.Thread.currentThread; 4 | 5 | public class ApiDeadLock 6 | { 7 | private final Object MUTEX = new Object(); 8 | 9 | private final API api = new API(); 10 | 11 | public void read() 12 | { 13 | synchronized (MUTEX) 14 | { 15 | api.method1(); 16 | System.out.println(currentThread().getName() + " execute read"); 17 | } 18 | } 19 | 20 | public void write() 21 | { 22 | api.method2(); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /design_pattern/src/main/java/com/wangwenjun/concurrent/chapter18/RealResult.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter18; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/3/26 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public class RealResult implements Result { 9 | 10 | private final Object resultValue; 11 | 12 | public RealResult(Object resultValue) { 13 | this.resultValue = resultValue; 14 | } 15 | 16 | @Override 17 | public Object getResultValue() { 18 | return this.resultValue; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter09/ActiveLoadTest.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter09; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/11/19 6 | * QQ: 532500648 7 | * QQ群:463962286 8 | ***************************************/ 9 | public class ActiveLoadTest 10 | { 11 | public static void main(String[] args) 12 | { 13 | /*Simple[] simples = new Simple[10]; 14 | System.out.println(simples.length);*/ 15 | 16 | System.out.println(GlobalConstants.MAX); 17 | System.out.println(GlobalConstants.RANDOM); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /design_pattern/src/main/java/com/wangwenjun/concurrent/chapter16/AppServerClient.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter16; 2 | 3 | import java.io.IOException; 4 | 5 | /*************************************** 6 | * @author:Alex Wang 7 | * @Date:2017/3/24 QQ:532500648 8 | * QQ交流群:286081824 9 | ***************************************/ 10 | public class AppServerClient { 11 | public static void main(String[] args) throws InterruptedException, IOException { 12 | AppServer server = new AppServer(13345); 13 | server.start(); 14 | Thread.sleep(15_000L); 15 | server.shutdown(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter23/Latch.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter23; 2 | 3 | import java.util.concurrent.TimeUnit; 4 | 5 | public abstract class Latch 6 | { 7 | protected int limit; 8 | 9 | public Latch(int limit) 10 | { 11 | this.limit = limit; 12 | } 13 | 14 | public abstract void await() 15 | throws InterruptedException; 16 | 17 | public abstract void await(TimeUnit unit, long time) 18 | throws InterruptedException, WaitTimeoutException; 19 | 20 | public abstract void countDown(); 21 | 22 | public abstract int getUnarrived(); 23 | } -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter06/ThreadGroupDestroy.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter06; 2 | 3 | public class ThreadGroupDestroy 4 | { 5 | 6 | public static void main(String[] args) 7 | { 8 | ThreadGroup group = new ThreadGroup("TestGroup"); 9 | 10 | ThreadGroup mainGroup = Thread.currentThread().getThreadGroup(); 11 | System.out.println("group.isDestroyed=" + group.isDestroyed()); 12 | mainGroup.list(); 13 | 14 | group.destroy(); 15 | 16 | System.out.println("group.isDestroyed=" + group.isDestroyed()); 17 | mainGroup.list(); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter11/MainThreadClassLoader.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter11; 2 | 3 | import static java.lang.Thread.currentThread; 4 | 5 | /*************************************** 6 | * @author:Alex Wang 7 | * @Date:2017/11/22 8 | * QQ: 532500648 9 | * QQ群:463962286 10 | ***************************************/ 11 | public class MainThreadClassLoader 12 | { 13 | public static void main(String[] args) throws ClassNotFoundException 14 | { 15 | System.out.println(currentThread().getContextClassLoader()); 16 | Class.forName("com.mysql.jdbc.Driver"); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter27/ActiveDaemonThread.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter27; 2 | 3 | class ActiveDaemonThread extends Thread 4 | { 5 | private final ActiveMessageQueue queue; 6 | 7 | public ActiveDaemonThread(ActiveMessageQueue queue) 8 | { 9 | super("ActiveDaemonThread"); 10 | this.queue = queue; 11 | setDaemon(true); 12 | } 13 | 14 | @Override 15 | public void run() 16 | { 17 | for (; ; ) 18 | { 19 | ActiveMessage activeMessage = this.queue.take(); 20 | activeMessage.execute(); 21 | } 22 | } 23 | } -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter04/API.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter04; 2 | 3 | import static java.lang.Thread.currentThread; 4 | 5 | /*************************************** 6 | * @author:Alex Wang 7 | * @Date:2017/11/1 8 | * 532500648 9 | ***************************************/ 10 | public class API 11 | { 12 | 13 | public synchronized void method1() 14 | { 15 | System.out.println(currentThread().getName() + " execute method1"); 16 | } 17 | 18 | public synchronized void method2() 19 | { 20 | System.out.println(currentThread().getName() + " execute method2"); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /design_pattern/src/main/java/com/wangwenjun/concurrent/chapter1/SingletonObject1.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter1; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/3/12 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public class SingletonObject1 { 9 | 10 | /** 11 | * can't lazy load. 12 | */ 13 | private static final SingletonObject1 instance = new SingletonObject1(); 14 | 15 | private SingletonObject1() { 16 | //empty 17 | } 18 | 19 | public static SingletonObject1 getInstance() { 20 | return instance; 21 | } 22 | } -------------------------------------------------------------------------------- /design_pattern/src/main/java/com/wangwenjun/concurrent/chapter12/BalkingClient.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter12; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/3/24 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public class BalkingClient { 9 | public static void main(String[] args) { 10 | BalkingData balkingData = new BalkingData("C:\\Users\\wangwenjun\\IdeaProjects\\java-concurrency\\design_pattern\\balking.txt", "===BEGIN===="); 11 | new CustomerThread(balkingData).start(); 12 | new WaiterThread(balkingData).start(); 13 | } 14 | } -------------------------------------------------------------------------------- /design_pattern/src/main/java/com/wangwenjun/concurrent/chapter7/ImmutableClient.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter7; 2 | 3 | import java.util.stream.IntStream; 4 | 5 | /*************************************** 6 | * @author:Alex Wang 7 | * @Date:2017/3/22 QQ:532500648 8 | * QQ交流群:286081824 9 | ***************************************/ 10 | public class ImmutableClient { 11 | public static void main(String[] args) { 12 | 13 | //Share data 14 | Person person = new Person("Alex", "GuanSu"); 15 | IntStream.range(0, 5).forEach(i -> 16 | new UsePersonThread(person).start() 17 | ); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /design_pattern/src/main/java/com/wangwenjun/concurrent/chapter1/SingletonObject6.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter1; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/3/12 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public class SingletonObject6 { 9 | 10 | private SingletonObject6() { 11 | 12 | } 13 | 14 | private static class InstanceHolder { 15 | private final static SingletonObject6 instance = new SingletonObject6(); 16 | } 17 | 18 | public static SingletonObject6 getInstance() { 19 | return InstanceHolder.instance; 20 | } 21 | } -------------------------------------------------------------------------------- /sharing/src/main/java/com/wangwenjun/concurrency/chapter2/SimpleCalculatorStrategy.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrency.chapter2; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/2/15 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public class SimpleCalculatorStrategy implements CalculatorStrategy { 9 | 10 | private final static double SALARY_RATE = 0.1; 11 | private final static double BONUS_RATE = 0.15; 12 | 13 | @Override 14 | public double calculate(double salary, double bonus) { 15 | return salary * SALARY_RATE + bonus * BONUS_RATE; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /design_pattern/src/main/java/com/wangwenjun/concurrent/chapter17/WorkerClient.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter17; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/3/25 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public class WorkerClient { 9 | public static void main(String[] args) { 10 | final Channel channel = new Channel(5); 11 | channel.startWorker(); 12 | 13 | new TransportThread("Alex", channel).start(); 14 | new TransportThread("Jack", channel).start(); 15 | new TransportThread("William", channel).start(); 16 | } 17 | } -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter27/OrderMessage.java: -------------------------------------------------------------------------------- 1 | //package com.wangwenjun.concurrent.chapter27; 2 | // 3 | //import java.util.Map; 4 | // 5 | //public class OrderMessage extends MethodMessage 6 | //{ 7 | // public OrderMessage(Map params, 8 | // OrderService orderService) 9 | // { 10 | // super(params, orderService); 11 | // } 12 | // 13 | // @Override 14 | // public void execute() 15 | // { 16 | // String account = (String) params.get("account"); 17 | // long orderId = (long) params.get("orderId"); 18 | // orderService.order(account, orderId); 19 | // } 20 | //} 21 | -------------------------------------------------------------------------------- /design_pattern/src/main/java/com/wangwenjun/concurrent/chapter18/DisplayStringRequest.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter18; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/3/26 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public class DisplayStringRequest extends MethodRequest { 9 | 10 | private final String text; 11 | 12 | public DisplayStringRequest(Servant servant, final String text) { 13 | super(servant, null); 14 | this.text = text; 15 | } 16 | 17 | @Override 18 | public void execute() { 19 | this.servant.displayString(text); 20 | } 21 | } -------------------------------------------------------------------------------- /design_pattern/src/main/java/com/wangwenjun/concurrent/chapter1/SingletonObject2.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter1; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/3/12 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public class SingletonObject2 { 9 | 10 | private static SingletonObject2 instance; 11 | 12 | private SingletonObject2() { 13 | //empty 14 | } 15 | 16 | public static SingletonObject2 getInstance() { 17 | if (null == instance) 18 | instance = new SingletonObject2(); 19 | 20 | return SingletonObject2.instance; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /design_pattern/src/main/java/com/wangwenjun/concurrent/chapter5/Client.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter5; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/3/19 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public class Client { 9 | public static void main(String[] args) { 10 | Gate gate = new Gate(); 11 | User bj = new User("Baobao", "Beijing", gate); 12 | User sh = new User("ShangLao", "ShangHai", gate); 13 | User gz = new User("GuangLao", "GuangZhou", gate); 14 | 15 | bj.start(); 16 | sh.start(); 17 | gz.start(); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /design_pattern/src/main/java/com/wangwenjun/concurrent/chapter1/SingletonObject3.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter1; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/3/12 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public class SingletonObject3 { 9 | private static SingletonObject3 instance; 10 | 11 | private SingletonObject3() { 12 | //empty 13 | } 14 | 15 | public synchronized static SingletonObject3 getInstance() { 16 | 17 | if (null == instance) 18 | instance = new SingletonObject3(); 19 | 20 | return SingletonObject3.instance; 21 | } 22 | } -------------------------------------------------------------------------------- /design_pattern/src/main/java/com/wangwenjun/concurrent/chapter7/UsePersonThread.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter7; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/3/22 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public class UsePersonThread extends Thread { 9 | private Person person; 10 | 11 | public UsePersonThread(Person person) { 12 | this.person = person; 13 | } 14 | 15 | @Override 16 | public void run() { 17 | while (true) { 18 | System.out.println(Thread.currentThread().getName() + " print " + person.toString()); 19 | } 20 | } 21 | } -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter16/EatTest.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter16; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/11/27 6 | * QQ: 532500648 7 | * QQ群:463962286 8 | ***************************************/ 9 | public class EatTest 10 | { 11 | public static void main(String[] args) 12 | { 13 | Tableware fork = new Tableware("fork"); 14 | Tableware knife = new Tableware("knife"); 15 | TablewarePair tablewarePair = new TablewarePair(fork, knife); 16 | new EatNoodleThread("A", tablewarePair).start(); 17 | new EatNoodleThread("B", tablewarePair).start(); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /design_pattern/src/main/java/com/wangwenjun/concurrent/chapter11/QueryFromDBAction.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter11; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/3/23 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public class QueryFromDBAction { 9 | 10 | public void execute() { 11 | try { 12 | Thread.sleep(1000L); 13 | String name = "Alex " + Thread.currentThread().getName(); 14 | ActionContext.getActionContext().getContext().setName(name); 15 | } catch (InterruptedException e) { 16 | e.printStackTrace(); 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /design_pattern/src/main/java/com/wangwenjun/concurrent/chapter18/MethodRequest.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter18; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/3/26 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | 9 | /** 10 | * 对应ActiveObject的每一个方法 11 | */ 12 | public abstract class MethodRequest { 13 | 14 | protected final Servant servant; 15 | 16 | protected final FutureResult futureResult; 17 | 18 | public MethodRequest(Servant servant, FutureResult futureResult) { 19 | this.servant = servant; 20 | this.futureResult = futureResult; 21 | } 22 | 23 | public abstract void execute(); 24 | } -------------------------------------------------------------------------------- /classLoader/src/main/java/com/wangwenjun/concurrent/classloader/chapter5/SimpleClassLoaderTest.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.classloader.chapter5; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/4/4 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public class SimpleClassLoaderTest { 9 | public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException { 10 | SimpleClassLoader simpleClassLoader = new SimpleClassLoader(); 11 | Class aClass = simpleClassLoader.loadClass("java.lang.String"); 12 | // System.out.println(aClass.getClassLoader()); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /design_pattern/src/main/java/com/wangwenjun/concurrent/chapter15/PerThreadClient.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter15; 2 | 3 | import java.util.stream.IntStream; 4 | 5 | /*************************************** 6 | * @author:Alex Wang 7 | * @Date:2017/3/24 QQ:532500648 8 | * QQ交流群:286081824 9 | ***************************************/ 10 | public class PerThreadClient { 11 | public static void main(String[] args) { 12 | final MessageHandler handler = new MessageHandler(); 13 | IntStream.rangeClosed(0, 10) 14 | .forEach( 15 | i -> handler.request(new Message(String.valueOf(i))) 16 | ); 17 | 18 | handler.shutdown(); 19 | } 20 | } -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter05/WaitNotify.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter05; 2 | 3 | public class WaitNotify 4 | { 5 | 6 | private final Object MUTEX = new Object(); 7 | 8 | private synchronized void testWait() 9 | { 10 | try 11 | { 12 | MUTEX.wait(); 13 | } catch (InterruptedException e) 14 | { 15 | e.printStackTrace(); 16 | } 17 | } 18 | 19 | private synchronized void testNotify() 20 | { 21 | MUTEX.notifyAll(); 22 | } 23 | 24 | public static void main(String[] args) 25 | { 26 | WaitNotify waitNotify = new WaitNotify(); 27 | waitNotify.testNotify(); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter14/Singleton.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter14; 2 | 3 | public class Singleton 4 | { 5 | //实例变量 6 | private byte[] data = new byte[1024]; 7 | 8 | private Singleton() 9 | { 10 | } 11 | 12 | private enum EnumHolder 13 | { 14 | INSTANCE; 15 | private Singleton instance; 16 | 17 | EnumHolder() 18 | { 19 | this.instance = new Singleton(); 20 | } 21 | 22 | private Singleton getSingleton() 23 | { 24 | return instance; 25 | } 26 | } 27 | 28 | public static Singleton getInstance() 29 | { 30 | return EnumHolder.INSTANCE.getSingleton(); 31 | } 32 | } -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter10/RuntimePackage.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter10; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/11/21 6 | * QQ: 532500648 7 | * QQ群:463962286 8 | ***************************************/ 9 | public class RuntimePackage 10 | { 11 | public static void main(String[] args) 12 | throws ClassNotFoundException, 13 | IllegalAccessException, InstantiationException 14 | { 15 | BrokerDelegateClassLoader classLoader = new BrokerDelegateClassLoader(); 16 | Class klass = classLoader.loadClass("com.wangwenjun.concurrent.chapter10.HelloWorld"); 17 | 18 | klass.newInstance(); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /design_pattern/src/main/java/com/wangwenjun/concurrent/chapter11/Context.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter11; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/3/23 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public class Context { 9 | 10 | private String name; 11 | private String cardId; 12 | 13 | public void setName(String name) { 14 | this.name = name; 15 | } 16 | 17 | public String getName() { 18 | return this.name; 19 | } 20 | 21 | public void setCardId(String cardId) { 22 | this.cardId = cardId; 23 | } 24 | 25 | public String getCardId() { 26 | return cardId; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /design_pattern/src/main/java/com/wangwenjun/concurrent/chapter18/Test.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter18; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/3/26 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public class Test { 9 | 10 | //A a-> B b 11 | // 12 | //main 13 | public static void main(String[] args) { 14 | // System.gc(); 15 | ActiveObject activeObject = ActiveObjectFactory.createActiveObject(); 16 | new MakerClientThread(activeObject, "Alice").start(); 17 | new MakerClientThread(activeObject, "Bobby").start(); 18 | 19 | new DisplayClientThread("Chris", activeObject).start(); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /jcuexample/src/main/java/com/wangwenjun/atomic/AtomicCompareTest.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.atomic; 2 | 3 | import java.util.concurrent.atomic.AtomicInteger; 4 | 5 | /*************************************** 6 | * @author:Alex Wang 7 | * @Date:2017/7/2 8 | * QQ:532500648 9 | * QQ交流群:286081824 10 | ***************************************/ 11 | public class AtomicCompareTest { 12 | public static void main(String[] args) throws InterruptedException { 13 | AtomicInteger atomicInteger = new AtomicInteger(123); 14 | // 15 | // atomicInteger.compareAndSet(124, 2352); 16 | // System.out.println(atomicInteger.get()); 17 | // Thread.currentThread().join(); 18 | 19 | int result = atomicInteger.addAndGet(10); 20 | } 21 | } -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter26/Production.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter26; 2 | 3 | public class Production extends InstructionBook 4 | { 5 | //产品编号 6 | private final int prodID; 7 | 8 | public Production(int prodID) 9 | { 10 | this.prodID = prodID; 11 | } 12 | 13 | @Override 14 | protected void firstProcess() 15 | { 16 | System.out.println("execute the " + prodID + " first process"); 17 | } 18 | 19 | @Override 20 | protected void secondProcess() 21 | { 22 | System.out.println("execute the " + prodID + " second process"); 23 | } 24 | 25 | @Override 26 | public String toString() 27 | { 28 | return "PROD:" + prodID; 29 | } 30 | } -------------------------------------------------------------------------------- /design_pattern/src/main/java/com/wangwenjun/concurrent/chapter9/SuspensionClient.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter9; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/3/23 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public class SuspensionClient { 9 | public static void main(String[] args) throws InterruptedException { 10 | 11 | final RequestQueue queue = new RequestQueue(); 12 | new ClientThread(queue, "Alex").start(); 13 | ServerThread serverThread = new ServerThread(queue); 14 | serverThread.start(); 15 | //serverThread.join(); 16 | 17 | Thread.sleep(10000); 18 | serverThread.close(); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /sharing/src/main/java/com/wangwenjun/concurrency/chapter11/Test2.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrency.chapter11; 2 | 3 | import java.util.Arrays; 4 | import java.util.Optional; 5 | 6 | /*************************************** 7 | * @author:Alex Wang 8 | * @Date:2017/2/24 QQ:532500648 9 | * QQ交流群:286081824 10 | ***************************************/ 11 | public class Test2 { 12 | 13 | public void test() { 14 | Arrays.asList(Thread.currentThread().getStackTrace()).stream() 15 | .filter(e -> !e.isNativeMethod()) 16 | .forEach(e -> Optional.of(e.getClassName() + ":" + e.getMethodName() + ":" + e.getLineNumber()) 17 | .ifPresent(System.out::println) 18 | ); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /sharing/src/main/java/com/wangwenjun/concurrency/chapter2/TicketWindow.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrency.chapter2; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/2/15 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public class TicketWindow extends Thread { 9 | 10 | private final String name; 11 | 12 | private static final int MAX = 50; 13 | 14 | private static int index = 1; 15 | 16 | public TicketWindow(String name) { 17 | this.name = name; 18 | } 19 | 20 | @Override 21 | public void run() { 22 | while (index <= MAX) { 23 | System.out.println("柜台:" + name + "当前的号码是:" + (index++)); 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /classLoader/src/main/java/com/wangwenjun/concurrent/classloader/chapter5/Namespace.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.classloader.chapter5; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/4/4 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public class Namespace { 9 | public static void main(String[] args) throws ClassNotFoundException { 10 | ClassLoader classLoader = Namespace.class.getClassLoader(); 11 | Class aClass = classLoader.loadClass("java.lang.String"); 12 | Class bClass = classLoader.loadClass("java.lang.String"); 13 | System.out.println(aClass.hashCode()); 14 | System.out.println(bClass.hashCode()); 15 | 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter10/BrokenDelegateClassLoaderTest.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter10; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/11/21 6 | * QQ: 532500648 7 | * QQ群:463962286 8 | ***************************************/ 9 | public class BrokenDelegateClassLoaderTest 10 | { 11 | public static void main(String[] args) 12 | throws ClassNotFoundException, IllegalAccessException, InstantiationException 13 | { 14 | BrokerDelegateClassLoader loader = new BrokerDelegateClassLoader(); 15 | Class aClass = loader.loadClass("com.wangwenjun.concurrent.chapter10.HelloWorld"); 16 | Object helloWorld = aClass.newInstance(); 17 | 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter10/SimpleClass.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter10; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | public class SimpleClass 7 | { 8 | private static byte[] buffer = new byte[8]; 9 | 10 | private static String str = ""; 11 | 12 | private static List list = new ArrayList<>(); 13 | 14 | static 15 | { 16 | buffer[0] = (byte) 1; 17 | str = "Simple"; 18 | list.add("element"); 19 | System.out.println(buffer[0]); 20 | System.out.println(str); 21 | System.out.println(list.get(0)); 22 | } 23 | 24 | public static void main(String[] args) 25 | { 26 | System.out.println(buffer.getClass()); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter21/ActionContextExample.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter21; 2 | 3 | import java.util.stream.IntStream; 4 | 5 | /*************************************** 6 | * @author:Alex Wang 7 | * @Date:2017/12/9 8 | * QQ: 532500648 9 | * QQ群:463962286 10 | ***************************************/ 11 | public class ActionContextExample 12 | { 13 | public static void main(String[] args) 14 | { 15 | for (int i = 0; i < 10; i++) 16 | { 17 | new Thread(() -> 18 | { 19 | /*ActionContext.get().setConfiguration(new Configuration()); 20 | System.out.println(ActionContext.get().getConfiguration());*/ 21 | }).start(); 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /design_pattern/src/main/java/com/wangwenjun/concurrent/chapter13/ProducerAndConsumerClient.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter13; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/3/24 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public class ProducerAndConsumerClient { 9 | 10 | public static void main(String[] args) { 11 | final MessageQueue messageQueue = new MessageQueue(); 12 | new ProducerThread(messageQueue, 1).start(); 13 | new ProducerThread(messageQueue, 2).start(); 14 | new ProducerThread(messageQueue, 3).start(); 15 | new ConsumerThread(messageQueue, 1).start(); 16 | new ConsumerThread(messageQueue, 2).start(); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /sharing/src/main/java/com/wangwenjun/concurrency/chapter10/Lock.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrency.chapter10; 2 | 3 | import java.util.Collection; 4 | 5 | /*************************************** 6 | * @author:Alex Wang 7 | * @Date:2017/2/22 QQ:532500648 8 | * QQ交流群:286081824 9 | ***************************************/ 10 | public interface Lock { 11 | 12 | class TimeOutException extends Exception { 13 | 14 | public TimeOutException(String message) { 15 | super(message); 16 | } 17 | } 18 | 19 | void lock() throws InterruptedException; 20 | 21 | void lock(long mills) throws InterruptedException, TimeOutException; 22 | 23 | void unlock(); 24 | 25 | Collection getBlockedThread(); 26 | 27 | int getBlockedSize(); 28 | 29 | } -------------------------------------------------------------------------------- /sharing/src/main/java/com/wangwenjun/concurrency/chapter7/BankVersion3.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrency.chapter7; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/2/19 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public class BankVersion3 { 9 | public static void main(String[] args) { 10 | final SynchronizedRunnable ticketWindow = new SynchronizedRunnable(); 11 | 12 | Thread windowThread1 = new Thread(ticketWindow, "一号窗口"); 13 | Thread windowThread2 = new Thread(ticketWindow, "二号窗口"); 14 | Thread windowThread3 = new Thread(ticketWindow, "三号窗口"); 15 | windowThread1.start(); 16 | windowThread2.start(); 17 | windowThread3.start(); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter27/ActiveOrderServiceTest.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter27; 2 | 3 | import static java.lang.Thread.currentThread; 4 | 5 | /*************************************** 6 | * @author:Alex Wang 7 | * @Date:2017/12/5 8 | * QQ: 532500648 9 | * QQ群:463962286 10 | ***************************************/ 11 | public class ActiveOrderServiceTest 12 | { 13 | public static void main(String[] args) 14 | throws InterruptedException 15 | { 16 | // OrderService orderService = OrderServiceFactory 17 | // .toActiveObject(new OrderServiceImpl()); 18 | // orderService.order("hello", 453453); 19 | // System.out.println("Return immediately"); 20 | currentThread().join(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter02/DaemonThread.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter02; 2 | 3 | public class DaemonThread 4 | { 5 | public static void main(String[] args) throws InterruptedException 6 | { 7 | Thread thread = new Thread(() -> 8 | { 9 | while (true) 10 | { 11 | try 12 | { 13 | Thread.sleep(1); 14 | } catch (InterruptedException e) 15 | { 16 | e.printStackTrace(); 17 | } 18 | } 19 | }); 20 | 21 | thread.setDaemon(true); 22 | thread.start(); 23 | Thread.sleep(2_000L); 24 | System.out.println("Main thread finished lifecycle."); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter29/UserChatApplication.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter29; 2 | 3 | public class UserChatApplication 4 | { 5 | public static void main(String[] args) 6 | { 7 | final AsyncEventDispatcher dispatcher = new AsyncEventDispatcher(); 8 | dispatcher.registerChannel(UserOnlineEvent.class, new UserOnlineEventChannel()); 9 | dispatcher.registerChannel(UserOfflineEvent.class, new UserOfflineEventChannel()); 10 | dispatcher.registerChannel(UserChatEvent.class, new UserChatEventChannel()); 11 | new UserChatThread(new User("Leo"), dispatcher).start(); 12 | new UserChatThread(new User("Alex"), dispatcher).start(); 13 | new UserChatThread(new User("Tina"), dispatcher).start(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /sharing/src/main/java/com/wangwenjun/concurrency/chapter7/BankVersion2.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrency.chapter7; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/2/15 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public class BankVersion2 { 9 | 10 | public static void main(String[] args) { 11 | 12 | final TicketWindowRunnable ticketWindow = new TicketWindowRunnable(); 13 | 14 | Thread windowThread1 = new Thread(ticketWindow, "一号窗口"); 15 | Thread windowThread2 = new Thread(ticketWindow, "二号窗口"); 16 | Thread windowThread3 = new Thread(ticketWindow, "三号窗口"); 17 | windowThread1.start(); 18 | windowThread2.start(); 19 | windowThread3.start(); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter10/LoadSimpleClass.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter10; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/11/22 6 | * QQ: 532500648 7 | * QQ群:463962286 8 | ***************************************/ 9 | public class LoadSimpleClass 10 | { 11 | public static void main(String[] args) throws ClassNotFoundException, 12 | IllegalAccessException, InstantiationException 13 | { 14 | BrokerDelegateClassLoader classLoader = new BrokerDelegateClassLoader("G\\classloader2"); 15 | Class aClass = classLoader.loadClass("com.wangwenjun.concurrent.chapter10.SimpleClass"); 16 | System.out.println(classLoader.getParent()); 17 | aClass.newInstance(); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter16/TablewarePair.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter16; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/11/27 6 | * QQ: 532500648 7 | * QQ群:463962286 8 | ***************************************/ 9 | public class TablewarePair 10 | { 11 | private final Tableware leftTool; 12 | 13 | private final Tableware rightTool; 14 | 15 | public TablewarePair(Tableware leftTool, Tableware rightTool) 16 | { 17 | this.leftTool = leftTool; 18 | this.rightTool = rightTool; 19 | } 20 | 21 | public Tableware getLeftTool() 22 | { 23 | return leftTool; 24 | } 25 | 26 | public Tableware getRightTool() 27 | { 28 | return rightTool; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /book/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | java-concurrency 7 | java-concurrency 8 | 1.0-SNAPSHOT 9 | 10 | 4.0.0 11 | 12 | book 13 | 14 | 15 | 16 | 17 | mysql 18 | mysql-connector-java 19 | 6.0.6 20 | 21 | 22 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter03/CurrentThread.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter03; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/10/25 6 | * 532500648 7 | ***************************************/ 8 | public class CurrentThread 9 | { 10 | public static void main(String[] args) 11 | { 12 | Thread thread = new Thread() 13 | { 14 | @Override 15 | public void run() 16 | { 17 | //always true 18 | System.out.println(Thread.currentThread() == this); 19 | } 20 | }; 21 | thread.start(); 22 | 23 | String name = Thread.currentThread().getName(); 24 | System.out.println("main".equals(name)); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /design_pattern/src/main/java/com/wangwenjun/concurrent/chapter18/ActiveObjectFactory.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter18; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/3/26 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public final class ActiveObjectFactory { 9 | 10 | private ActiveObjectFactory() { 11 | } 12 | 13 | public static ActiveObject createActiveObject() { 14 | Servant servant = new Servant(); 15 | ActivationQueue queue = new ActivationQueue(); 16 | SchedulerThread schedulerThread = new SchedulerThread(queue); 17 | ActiveObjectProxy proxy = new ActiveObjectProxy(schedulerThread,servant); 18 | schedulerThread.start(); 19 | return proxy; 20 | } 21 | } -------------------------------------------------------------------------------- /design_pattern/src/main/java/com/wangwenjun/concurrent/chapter4/ObserverClient.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter4; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/3/18 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public class ObserverClient { 9 | public static void main(String[] args) { 10 | 11 | final Subject subject = new Subject(); 12 | new BinaryObserver(subject); 13 | new OctalObserver(subject); 14 | System.out.println("=================="); 15 | subject.setState(10); 16 | System.out.println("=================="); 17 | subject.setState(10); 18 | 19 | System.out.println("=================="); 20 | subject.setState(15); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /design_pattern/src/main/java/com/wangwenjun/concurrent/chapter17/Request.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter17; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/3/25 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public class Request { 9 | 10 | private final String name; 11 | 12 | private final int number; 13 | 14 | public Request(final String name, final int number) { 15 | this.name = name; 16 | this.number = number; 17 | } 18 | 19 | public void execute() { 20 | System.out.println(Thread.currentThread().getName() + " executed " + this); 21 | } 22 | 23 | @Override 24 | public String toString() { 25 | return "Request=> No. " + number + " Name. " + name; 26 | } 27 | } -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter28/FileChangeEvent.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter28; 2 | 3 | import java.nio.file.Path; 4 | import java.nio.file.WatchEvent; 5 | 6 | /*************************************** 7 | * @author:Alex Wang 8 | * @Date:2017/10/19 9 | * 532500648 10 | ***************************************/ 11 | public class FileChangeEvent 12 | { 13 | 14 | private final Path path; 15 | 16 | private final WatchEvent.Kind kind; 17 | 18 | public FileChangeEvent(Path path, WatchEvent.Kind kind) 19 | { 20 | this.path = path; 21 | this.kind = kind; 22 | } 23 | 24 | public Path getPath() 25 | { 26 | return path; 27 | } 28 | 29 | public WatchEvent.Kind getKind() 30 | { 31 | return kind; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /design_pattern/src/main/java/com/wangwenjun/concurrent/chapter18/SchedulerThread.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter18; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/3/26 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public class SchedulerThread extends Thread { 9 | 10 | private final ActivationQueue activationQueue; 11 | 12 | public SchedulerThread(ActivationQueue activationQueue) { 13 | this.activationQueue = activationQueue; 14 | } 15 | 16 | public void invoke(MethodRequest request) { 17 | this.activationQueue.put(request); 18 | } 19 | 20 | @Override 21 | public void run() { 22 | while (true) { 23 | activationQueue.take().execute(); 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /sharing/src/main/java/com/wangwenjun/concurrency/chapter2/Bank.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrency.chapter2; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/2/15 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public class Bank { 9 | public static void main(String[] args) { 10 | 11 | TicketWindow ticketWindow1 = new TicketWindow("一号出号机"); 12 | ticketWindow1.start(); 13 | 14 | TicketWindow ticketWindow2 = new TicketWindow("二号出号机"); 15 | ticketWindow2.start(); 16 | 17 | TicketWindow ticketWindow3 = new TicketWindow("三号出号机"); 18 | ticketWindow3.start(); 19 | 20 | TicketWindow ticketWindow4 = new TicketWindow("四号出号机"); 21 | ticketWindow4.start(); 22 | 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /sharing/src/main/java/com/wangwenjun/concurrency/chapter2/TicketWindowRunnable.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrency.chapter2; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/2/15 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public class TicketWindowRunnable implements Runnable { 9 | 10 | private int index = 1; 11 | 12 | private final static int MAX = 50; 13 | 14 | @Override 15 | public void run() { 16 | 17 | while (index <= MAX) { 18 | System.out.println(Thread.currentThread() + " 的号码是:" + (index++)); 19 | try { 20 | Thread.sleep(100); 21 | } catch (InterruptedException e) { 22 | e.printStackTrace(); 23 | } 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter22/AutoSaveThread.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter22; 2 | 3 | import java.io.IOException; 4 | import java.util.concurrent.TimeUnit; 5 | 6 | public class AutoSaveThread extends Thread 7 | { 8 | 9 | private final Document document; 10 | 11 | public AutoSaveThread(Document document) 12 | { 13 | super("DocumentAutoSaveThread"); 14 | this.document = document; 15 | } 16 | 17 | @Override 18 | public void run() 19 | { 20 | while (true) 21 | { 22 | try 23 | { 24 | document.save(); 25 | TimeUnit.SECONDS.sleep(1); 26 | } catch (IOException | InterruptedException e) 27 | { 28 | break; 29 | } 30 | } 31 | } 32 | } -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter04/Mutex.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter04; 2 | 3 | import java.util.concurrent.TimeUnit; 4 | 5 | public class Mutex 6 | { 7 | 8 | private final static Object MUTEX = new Object(); 9 | 10 | public void accessResource() 11 | { 12 | synchronized (MUTEX) 13 | { 14 | try 15 | { 16 | TimeUnit.MINUTES.sleep(10); 17 | } catch (InterruptedException e) 18 | { 19 | e.printStackTrace(); 20 | } 21 | } 22 | } 23 | 24 | public static void main(String[] args) 25 | { 26 | final Mutex mutex = new Mutex(); 27 | for (int i = 0; i < 5; i++) 28 | { 29 | new Thread(mutex::accessResource).start(); 30 | } 31 | } 32 | } -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter03/Threadinterrupted.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter03; 2 | 3 | import java.util.concurrent.TimeUnit; 4 | 5 | public class Threadinterrupted 6 | { 7 | public static void main(String[] args) throws InterruptedException 8 | { 9 | 10 | Thread thread = new Thread() 11 | { 12 | @Override 13 | public void run() 14 | { 15 | while (true) 16 | { 17 | System.out.println(Thread.interrupted()); 18 | } 19 | } 20 | }; 21 | thread.setDaemon(true); 22 | thread.start(); 23 | 24 | //shortly block make sure the thread is started. 25 | TimeUnit.MILLISECONDS.sleep(2); 26 | thread.interrupt(); 27 | 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter28/EventBusExample.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter28; 2 | 3 | import java.util.concurrent.Executors; 4 | import java.util.concurrent.ThreadPoolExecutor; 5 | 6 | /*************************************** 7 | * @author:Alex Wang 8 | * @Date:2017/11/28 9 | * QQ: 532500648 10 | * QQ群:463962286 11 | ***************************************/ 12 | public class EventBusExample 13 | { 14 | public static void main(String[] args) 15 | { 16 | Bus bus = new AsyncEventBus("TestBus", (ThreadPoolExecutor) Executors.newFixedThreadPool(10)); 17 | bus.register(new SimpleSubscriber1()); 18 | bus.register(new SimpleSubscriber2()); 19 | bus.post("Hello"); 20 | System.out.println("------------"); 21 | bus.post("Hello", "test"); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /design_pattern/src/main/java/com/wangwenjun/concurrent/chapter1/SingletonObject4.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter1; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/3/12 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public class SingletonObject4 { 9 | 10 | private static SingletonObject4 instance; 11 | 12 | private SingletonObject4() { 13 | //--- 14 | } 15 | 16 | //double check 17 | public static SingletonObject4 getInstance() { 18 | 19 | if (null == instance) { 20 | synchronized (SingletonObject4.class) { 21 | if (null == instance) 22 | instance = new SingletonObject4(); 23 | } 24 | } 25 | 26 | return SingletonObject4.instance; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /design_pattern/src/main/java/com/wangwenjun/concurrent/chapter10/ThreadLocalSimpleTest.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter10; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/3/23 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public class ThreadLocalSimpleTest { 9 | 10 | private static ThreadLocal threadLocal = new ThreadLocal() { 11 | @Override 12 | protected String initialValue() { 13 | return "Alex"; 14 | } 15 | }; 16 | 17 | //JVM start main thread 18 | public static void main(String[] args) throws InterruptedException { 19 | // threadLocal.set("Alex"); 20 | Thread.sleep(1000); 21 | String value = threadLocal.get(); 22 | System.out.println(value); 23 | } 24 | } -------------------------------------------------------------------------------- /sharing/src/main/java/com/wangwenjun/concurrency/chapter8/DeadLock.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrency.chapter8; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/2/19 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public class DeadLock { 9 | 10 | private OtherService otherService; 11 | 12 | public DeadLock(OtherService otherService) { 13 | this.otherService = otherService; 14 | } 15 | 16 | private final Object lock = new Object(); 17 | 18 | public void m1() { 19 | synchronized (lock) { 20 | System.out.println("m1"); 21 | otherService.s1(); 22 | } 23 | } 24 | 25 | public void m2() { 26 | synchronized (lock) { 27 | System.out.println("m2"); 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /design_pattern/src/main/java/com/wangwenjun/concurrent/chapter5/User.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter5; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/3/19 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public class User extends Thread { 9 | 10 | private final String myName; 11 | 12 | private final String myAddress; 13 | 14 | private final Gate gate; 15 | 16 | public User(String myName, String myAddress, Gate gate) { 17 | this.myName = myName; 18 | this.myAddress = myAddress; 19 | this.gate = gate; 20 | } 21 | 22 | @Override 23 | public void run() { 24 | System.out.println(myName + " BEGIN"); 25 | while (true) { 26 | this.gate.pass(myName, myAddress); 27 | } 28 | } 29 | } -------------------------------------------------------------------------------- /sharing/src/main/java/com/wangwenjun/concurrency/chapter8/OtherService.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrency.chapter8; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/2/19 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public class OtherService { 9 | 10 | private final Object lock = new Object(); 11 | 12 | private DeadLock deadLock; 13 | 14 | public void s1() { 15 | synchronized (lock) { 16 | System.out.println("s1=========="); 17 | } 18 | } 19 | 20 | public void s2() { 21 | synchronized (lock) { 22 | System.out.println("s2=========="); 23 | deadLock.m2(); 24 | } 25 | } 26 | 27 | public void setDeadLock(DeadLock deadLock) { 28 | this.deadLock = deadLock; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /design_pattern/src/main/java/com/wangwenjun/concurrent/chapter1/SingletonObject5.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter1; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/3/12 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public class SingletonObject5 { 9 | 10 | private static volatile SingletonObject5 instance; 11 | 12 | private SingletonObject5() { 13 | // 14 | } 15 | 16 | //double check add volatile 17 | public static SingletonObject5 getInstance() { 18 | 19 | if (null == instance) { 20 | synchronized (SingletonObject4.class) { 21 | if (null == instance) 22 | instance = new SingletonObject5(); 23 | } 24 | } 25 | return SingletonObject5.instance; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /design_pattern/src/main/java/com/wangwenjun/concurrent/chapter14/CountDown.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter14; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/3/24 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public class CountDown { 9 | private final int total; 10 | 11 | private int counter = 0; 12 | 13 | public CountDown(int total) { 14 | this.total = total; 15 | } 16 | 17 | public void down() { 18 | synchronized (this) { 19 | this.counter++; 20 | this.notifyAll(); 21 | } 22 | } 23 | 24 | public void await() throws InterruptedException { 25 | synchronized (this) { 26 | while (counter != total) { 27 | this.wait(); 28 | } 29 | } 30 | } 31 | } -------------------------------------------------------------------------------- /design_pattern/src/main/java/com/wangwenjun/concurrent/chapter6/ReaderWorker.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter6; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/3/19 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public class ReaderWorker extends Thread { 9 | 10 | private final SharedData data; 11 | 12 | public ReaderWorker(SharedData data) { 13 | this.data = data; 14 | } 15 | 16 | @Override 17 | public void run() { 18 | try { 19 | while (true) { 20 | char[] readBuf = data.read(); 21 | System.out.println(Thread.currentThread().getName() + " reads " + String.valueOf(readBuf)); 22 | } 23 | } catch (InterruptedException e) { 24 | e.printStackTrace(); 25 | } 26 | } 27 | } -------------------------------------------------------------------------------- /sharing/src/main/java/com/wangwenjun/concurrency/chapter2/BankVersion2.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrency.chapter2; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/2/15 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public class BankVersion2 { 9 | 10 | 11 | 12 | public static void main(String[] args) { 13 | 14 | final TicketWindowRunnable task = new TicketWindowRunnable(); 15 | 16 | Thread windowThread1 = new Thread(task, "一号窗口"); 17 | Thread windowThread2 = new Thread(task, "二号窗口"); 18 | Thread windowThread3 = new Thread(task, "三号窗口"); 19 | Thread windowThread4 = new Thread(task, "三号窗口"); 20 | windowThread1.start(); 21 | windowThread2.start(); 22 | windowThread3.start(); 23 | windowThread4.start(); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /example/example.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /java-concurrency.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /sharing/sharing.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /design_pattern/src/main/java/com/wangwenjun/concurrent/chapter11/QueryFromHttpAction.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter11; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/3/23 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public class QueryFromHttpAction { 9 | 10 | public void execute() { 11 | Context context = ActionContext.getActionContext().getContext(); 12 | String name = context.getName(); 13 | String cardId = getCardId(name); 14 | context.setCardId(cardId); 15 | } 16 | 17 | private String getCardId(String name) { 18 | try { 19 | Thread.sleep(1000L); 20 | } catch (InterruptedException e) { 21 | e.printStackTrace(); 22 | } 23 | 24 | return "435467523543" + Thread.currentThread().getId(); 25 | } 26 | } -------------------------------------------------------------------------------- /design_pattern/src/main/java/com/wangwenjun/concurrent/chapter8/AsynFuture.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter8; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/3/22 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public class AsynFuture implements Future { 9 | 10 | private volatile boolean done = false; 11 | 12 | private T result; 13 | 14 | public void done(T result) { 15 | synchronized (this) { 16 | this.result = result; 17 | this.done = true; 18 | this.notifyAll(); 19 | } 20 | } 21 | 22 | @Override 23 | public T get() throws InterruptedException { 24 | synchronized (this) { 25 | while (!done) { 26 | this.wait(); 27 | } 28 | } 29 | return result; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter09/ClassInit.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter09; 2 | 3 | import java.util.concurrent.TimeUnit; 4 | import java.util.stream.IntStream; 5 | 6 | /*************************************** 7 | * @author:Alex Wang 8 | * @Date:2017/11/20 9 | * QQ: 532500648 10 | * QQ群:463962286 11 | ***************************************/ 12 | public class ClassInit 13 | { 14 | static 15 | { 16 | try 17 | { 18 | System.out.println("The ClassInit static code block will be invoke."); 19 | TimeUnit.SECONDS.sleep(10); 20 | } catch (InterruptedException e) 21 | { 22 | e.printStackTrace(); 23 | } 24 | } 25 | 26 | public static void main(String[] args) 27 | { 28 | IntStream.range(0, 5) 29 | .forEach(i -> new Thread(ClassInit::new)); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /design_pattern/design_pattern.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /jcu/jcu.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter07/CaptureThreadException.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter07; 2 | 3 | import java.util.concurrent.TimeUnit; 4 | 5 | public class CaptureThreadException 6 | { 7 | 8 | public static void main(String[] args) 9 | { 10 | 11 | Thread.setDefaultUncaughtExceptionHandler((t, e) -> 12 | { 13 | System.out.println(t.getName() + " occur exception"); 14 | e.printStackTrace(); 15 | }); 16 | final Thread thread = new Thread(() -> 17 | { 18 | try 19 | { 20 | TimeUnit.SECONDS.sleep(2); 21 | } catch (InterruptedException e) 22 | { 23 | } 24 | 25 | //here will throw unchecked exception. 26 | System.out.println(1 / 0); 27 | }, "Test-Thread"); 28 | 29 | thread.start(); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /sharing/src/main/java/com/wangwenjun/concurrency/chapter2/TaxCalculatorMain.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrency.chapter2; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/2/15 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public class TaxCalculatorMain { 9 | 10 | public static void main(String[] args) { 11 | /*TaxCalaculator calculator = new TaxCalaculator(10000d, 2000d) { 12 | 13 | @Override 14 | public double calcTax() { 15 | return getSalary() * 0.1 + getBonus() * 0.15; 16 | } 17 | }; 18 | double tax = calculator.calculate(); 19 | System.out.println(tax);*/ 20 | 21 | TaxCalaculator calculator = new TaxCalaculator(10000d, 2000d, (s, b) -> s * 0.1 + b * 0.15); 22 | System.out.println(calculator.calculate()); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /jcuexample/jcuexample.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter24/TaskHandler.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter24; 2 | 3 | import java.util.concurrent.TimeUnit; 4 | 5 | import static java.util.concurrent.ThreadLocalRandom.current; 6 | 7 | public class TaskHandler implements Runnable 8 | { 9 | 10 | private final Request request; 11 | 12 | public TaskHandler(Request request) 13 | { 14 | this.request = request; 15 | } 16 | 17 | @Override 18 | public void run() 19 | { 20 | System.out.println("Begin handle " + request); 21 | slowly(); 22 | System.out.println("End handle " + request); 23 | } 24 | 25 | private void slowly() 26 | { 27 | try 28 | { 29 | TimeUnit.SECONDS.sleep(current().nextInt(10)); 30 | } catch (InterruptedException e) 31 | { 32 | e.printStackTrace(); 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter18/ShareData.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter18; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/11/27 6 | * QQ: 532500648 7 | * QQ群:463962286 8 | ***************************************/ 9 | public class ShareData 10 | { 11 | private String shareData = "Hello"; 12 | 13 | public void append(String append) 14 | { 15 | this.shareData = shareData + append; 16 | System.out.println(this.shareData); 17 | } 18 | 19 | public static void main(String[] args) 20 | { 21 | final ShareData shareData = new ShareData(); 22 | 23 | new Thread(() -> 24 | { 25 | int i = 0; 26 | while (true) 27 | { 28 | shareData.append(String.valueOf(i)); 29 | i++; 30 | } 31 | }).start(); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter19/FutureTest.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter19; 2 | 3 | import java.util.concurrent.TimeUnit; 4 | 5 | /*************************************** 6 | * @author:Alex Wang 7 | * @Date:2017/11/24 8 | * QQ: 532500648 9 | * QQ群:463962286 10 | ***************************************/ 11 | public class FutureTest 12 | { 13 | public static void main(String[] args) 14 | throws InterruptedException 15 | { 16 | FutureService service = FutureService.newService(); 17 | service.submit(input -> 18 | { 19 | try 20 | { 21 | TimeUnit.SECONDS.sleep(10); 22 | } catch (InterruptedException e) 23 | { 24 | e.printStackTrace(); 25 | } 26 | return input.length(); 27 | }, "Hello", System.out::println); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /design_pattern/src/main/java/com/wangwenjun/concurrent/chapter18/MakeStringRequest.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter18; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/3/26 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | 9 | /** 10 | * {@link ActiveObject#makeString(int, char)} 11 | */ 12 | public class MakeStringRequest extends MethodRequest { 13 | 14 | private final int count; 15 | private final char fillChar; 16 | 17 | public MakeStringRequest(Servant servant, FutureResult futureResult, int count, char fillChar) { 18 | super(servant, futureResult); 19 | this.fillChar = fillChar; 20 | this.count = count; 21 | } 22 | 23 | @Override 24 | public void execute() { 25 | Result result = servant.makeString(count, fillChar); 26 | futureResult.setResult(result); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /design_pattern/src/main/java/com/wangwenjun/concurrent/chapter7/Person.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter7; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/3/22 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | final public class Person { 9 | private final String name; 10 | private final String address; 11 | 12 | public Person(final String name, final String address) { 13 | this.name = name; 14 | this.address = address; 15 | } 16 | 17 | public String getName() { 18 | return name; 19 | } 20 | 21 | public String getAddress() { 22 | return address; 23 | } 24 | 25 | @Override 26 | public String toString() { 27 | return "Person{" + 28 | "name='" + name + '\'' + 29 | ", address='" + address + '\'' + 30 | '}'; 31 | } 32 | } -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter06/ThreadGroupEnumerateThreadGroups.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter06; 2 | 3 | import java.util.concurrent.TimeUnit; 4 | 5 | public class ThreadGroupEnumerateThreadGroups 6 | { 7 | public static void main(String[] args) 8 | throws InterruptedException 9 | { 10 | 11 | ThreadGroup myGroup1 = new ThreadGroup("MyGroup1"); 12 | ThreadGroup myGroup2 = new ThreadGroup(myGroup1,"MyGroup2"); 13 | 14 | 15 | TimeUnit.MILLISECONDS.sleep(2); 16 | ThreadGroup mainGroup = Thread.currentThread().getThreadGroup(); 17 | 18 | 19 | ThreadGroup[] list = new ThreadGroup[mainGroup.activeGroupCount()]; 20 | 21 | int recurseSize = mainGroup.enumerate(list); 22 | System.out.println(recurseSize); 23 | 24 | recurseSize = mainGroup.enumerate(list, false); 25 | System.out.println(recurseSize); 26 | } 27 | } -------------------------------------------------------------------------------- /sharing/src/main/java/com/wangwenjun/concurrency/chapter3/CreateThread3.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrency.chapter3; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/2/16 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public class CreateThread3 { 9 | 10 | private int i = 0; 11 | 12 | private byte[] bytes = new byte[1024]; 13 | 14 | private static int counter = 0; 15 | 16 | //JVM will create a thread named "main" 17 | public static void main(String[] args) { 18 | //create a JVM stack 19 | try { 20 | add(0); 21 | } catch (Error e) { 22 | e.printStackTrace(); 23 | System.out.println(counter); 24 | } 25 | } 26 | 27 | private static void add(int i) { 28 | ++counter; 29 | add(i + 1); 30 | } 31 | } 32 | 33 | 34 | //StackOverflowError 35 | //21456 -------------------------------------------------------------------------------- /example/src/main/java/com/wangwenjun/concurrency/CreateThreadGroup.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrency; 2 | 3 | import java.io.File; 4 | import java.nio.file.Path; 5 | import java.nio.file.Paths; 6 | 7 | /*************************************** 8 | * @author:Alex Wang 9 | * @Date:2017/2/24 QQ:532500648 10 | * QQ交流群:286081824 11 | ***************************************/ 12 | public class CreateThreadGroup { 13 | 14 | public static void main(String[] args) { 15 | // 16 | // ThreadGroup t = new ThreadGroup("test"); 17 | // Path path = Paths.get("G:\\Teaching\\汪文君多线程深入详解实战视频\\汪文君多线程编程实战视频-第一阶段"); 18 | // path.iterator().forEachRemaining(System.out::println); 19 | File file = new File("G:\\Teaching\\汪文君多线程深入详解实战视频\\汪文君多线程编程实战视频-第一阶段"); 20 | for(File f:file.listFiles()){ 21 | if(f.getName().endsWith(".wmv")) 22 | System.out.println(f.getName()); 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /design_pattern/src/main/java/com/wangwenjun/concurrent/chapter6/ReadWritLockClient.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter6; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/3/19 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | 9 | /** 10 | * ReadWriteLock design pattern 11 | * Reader-Writer design pattern 12 | */ 13 | public class ReadWritLockClient { 14 | public static void main(String[] args) { 15 | final SharedData sharedData = new SharedData(10); 16 | new ReaderWorker(sharedData).start(); 17 | new ReaderWorker(sharedData).start(); 18 | new ReaderWorker(sharedData).start(); 19 | new ReaderWorker(sharedData).start(); 20 | new ReaderWorker(sharedData).start(); 21 | new WriterWorker(sharedData, "qwertyuiopasdfg").start(); 22 | new WriterWorker(sharedData, "QWERTYUIOPASDFG").start(); 23 | } 24 | } -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter09/Singleton.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter09; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/11/19 6 | * QQ: 532500648 7 | * QQ群:463962286 8 | ***************************************/ 9 | public class Singleton 10 | { 11 | 12 | private static Singleton instance = new Singleton(); 13 | 14 | private static int x = 0; 15 | 16 | private static int y; 17 | 18 | 19 | 20 | private Singleton() 21 | { 22 | x++; 23 | y++; 24 | } 25 | 26 | public static Singleton getInstance() 27 | { 28 | return instance; 29 | } 30 | 31 | public static void main(String[] args) 32 | { 33 | Singleton singleton = Singleton.getInstance(); 34 | System.out.println(singleton); 35 | System.out.println(singleton.x); 36 | System.out.println(singleton.y); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /design_pattern/src/main/java/com/wangwenjun/concurrent/chapter18/FutureResult.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter18; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/3/26 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public class FutureResult implements Result { 9 | 10 | private Result result; 11 | 12 | private boolean ready = false; 13 | 14 | public synchronized void setResult(Result result) { 15 | this.result = result; 16 | this.ready = true; 17 | this.notifyAll(); 18 | } 19 | 20 | @Override 21 | public synchronized Object getResultValue() { 22 | while (!ready) { 23 | try { 24 | this.wait(); 25 | } catch (InterruptedException e) { 26 | e.printStackTrace(); 27 | } 28 | } 29 | return this.result.getResultValue(); 30 | } 31 | } -------------------------------------------------------------------------------- /sharing/src/main/java/com/wangwenjun/concurrency/chapter3/CreateThread4.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrency.chapter3; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/2/16 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public class CreateThread4 { 9 | 10 | private static int counter = 1; 11 | 12 | public static void main(String[] args) { 13 | 14 | Thread t1 = new Thread(null, new Runnable() { 15 | @Override 16 | public void run() { 17 | try { 18 | add(1); 19 | } catch (Error e) { 20 | System.out.println(counter); 21 | } 22 | } 23 | 24 | private void add(int i) { 25 | counter++; 26 | add(i + 1); 27 | } 28 | }, "Test", 1 << 24); 29 | t1.start(); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter08/InternalTask.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter08; 2 | 3 | public class InternalTask implements Runnable 4 | { 5 | 6 | private final RunnableQueue runnableQueue; 7 | 8 | private volatile boolean running = true; 9 | 10 | public InternalTask(RunnableQueue runnableQueue) 11 | { 12 | this.runnableQueue = runnableQueue; 13 | } 14 | 15 | @Override 16 | public void run() 17 | { 18 | while (running && !Thread.currentThread().isInterrupted()) 19 | { 20 | try 21 | { 22 | Runnable task = runnableQueue.take(); 23 | task.run(); 24 | 25 | } catch (InterruptedException e) 26 | { 27 | running = false; 28 | break; 29 | } 30 | } 31 | } 32 | 33 | public void stop() 34 | { 35 | this.running = false; 36 | } 37 | } -------------------------------------------------------------------------------- /sharing/src/main/java/com/wangwenjun/concurrency/chapter7/SychronizedStaticTest.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrency.chapter7; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/2/19 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public class SychronizedStaticTest { 9 | public static void main(String[] args) { 10 | new Thread("T1") { 11 | @Override 12 | public void run() { 13 | SychronizedStatic.m1(); 14 | } 15 | }.start(); 16 | 17 | new Thread("T2") { 18 | @Override 19 | public void run() { 20 | SychronizedStatic.m2(); 21 | } 22 | }.start(); 23 | 24 | new Thread("T3") { 25 | @Override 26 | public void run() { 27 | SychronizedStatic.m3(); 28 | } 29 | }.start(); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /design_pattern/src/main/java/com/wangwenjun/concurrent/chapter11/ExecutionTask.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter11; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/3/23 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public class ExecutionTask implements Runnable { 9 | 10 | private QueryFromDBAction queryAction = new QueryFromDBAction(); 11 | 12 | private QueryFromHttpAction httpAction = new QueryFromHttpAction(); 13 | 14 | @Override 15 | public void run() { 16 | 17 | queryAction.execute(); 18 | System.out.println("The name query successful"); 19 | httpAction.execute(); 20 | System.out.println("The card id query successful"); 21 | 22 | Context context = ActionContext.getActionContext().getContext(); 23 | System.out.println("The Name is " + context.getName() + " and CardId " + context.getCardId()); 24 | } 25 | } -------------------------------------------------------------------------------- /design_pattern/src/main/java/com/wangwenjun/concurrent/chapter7/ImmutableTest.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter7; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Collections; 5 | import java.util.List; 6 | 7 | /*************************************** 8 | * @author:Alex Wang 9 | * @Date:2017/3/22 QQ:532500648 10 | * QQ交流群:286081824 11 | ***************************************/ 12 | public class ImmutableTest { 13 | 14 | private final int age; 15 | private final String name; 16 | private final List list; 17 | 18 | 19 | public ImmutableTest(int age, String name) { 20 | this.age = age; 21 | this.name = name; 22 | list = new ArrayList<>(); 23 | } 24 | 25 | public int getAge() { 26 | return age; 27 | } 28 | 29 | public String getName() { 30 | return name; 31 | } 32 | 33 | public List getList() { 34 | return Collections.unmodifiableList(list); 35 | } 36 | } -------------------------------------------------------------------------------- /jcuexample/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | java-concurrency 7 | java-concurrency 8 | 1.0-SNAPSHOT 9 | 10 | 4.0.0 11 | 12 | jcu-example 13 | 14 | 15 | 16 | 17 | maven-compiler-plugin 18 | 3.1 19 | 20 | 1.8 21 | 1.8 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /book/book.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter01/DuplicatedStartThread.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter01; 2 | 3 | import java.util.concurrent.TimeUnit; 4 | 5 | /*************************************** 6 | * @author:Alex Wang 7 | * @Date:2017/10/22 8 | * 532500648 9 | ***************************************/ 10 | public class DuplicatedStartThread 11 | { 12 | public static void main(String[] args) throws InterruptedException 13 | { 14 | Thread thread = new Thread() 15 | { 16 | @Override 17 | public void run() 18 | { 19 | try 20 | { 21 | TimeUnit.SECONDS.sleep(1); 22 | } catch (InterruptedException e) 23 | { 24 | e.printStackTrace(); 25 | } 26 | } 27 | }; 28 | thread.start(); 29 | TimeUnit.SECONDS.sleep(2); 30 | thread.start(); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /sharing/src/main/java/com/wangwenjun/concurrency/chapter4/ThreadSimpleAPI.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrency.chapter4; 2 | 3 | import java.util.Optional; 4 | 5 | /*************************************** 6 | * @author:Alex Wang 7 | * @Date:2017/2/17 QQ:532500648 8 | * QQ交流群:286081824 9 | ***************************************/ 10 | public class ThreadSimpleAPI { 11 | public static void main(String[] args) { 12 | Thread t = new Thread(() -> { 13 | Optional.of("Hello").ifPresent(System.out::println); 14 | try { 15 | Thread.sleep(100_000); 16 | } catch (InterruptedException e) { 17 | e.printStackTrace(); 18 | } 19 | }, "t1"); 20 | 21 | t.start(); 22 | Optional.of(t.getName()).ifPresent(System.out::println); 23 | Optional.of(t.getId()).ifPresent(System.out::println); 24 | Optional.of(t.getPriority()).ifPresent(System.out::println); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /design_pattern/src/main/java/com/wangwenjun/concurrent/chapter11/ActionContext.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter11; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/3/23 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public final class ActionContext { 9 | 10 | private static final ThreadLocal threadLocal = new ThreadLocal() { 11 | @Override 12 | protected Context initialValue() { 13 | return new Context(); 14 | } 15 | }; 16 | 17 | private static class ContextHolder { 18 | private final static ActionContext actionContext = new ActionContext(); 19 | } 20 | 21 | public static ActionContext getActionContext() { 22 | return ContextHolder.actionContext; 23 | } 24 | 25 | public Context getContext() { 26 | return threadLocal.get(); 27 | } 28 | 29 | private ActionContext(){ 30 | 31 | } 32 | } -------------------------------------------------------------------------------- /sharing/src/main/java/com/wangwenjun/concurrency/chapter6/ThreadCloseForce.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrency.chapter6; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/2/19 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public class ThreadCloseForce { 9 | 10 | 11 | public static void main(String[] args) { 12 | 13 | ThreadService service = new ThreadService(); 14 | long start = System.currentTimeMillis(); 15 | service.execute(() -> { 16 | //load a very heavy resource. 17 | /*while (true) { 18 | 19 | }*/ 20 | try { 21 | Thread.sleep(5000); 22 | } catch (InterruptedException e) { 23 | e.printStackTrace(); 24 | } 25 | }); 26 | service.shutdown(10000); 27 | long end = System.currentTimeMillis(); 28 | System.out.println(end - start); 29 | } 30 | } -------------------------------------------------------------------------------- /design_pattern/src/main/java/com/wangwenjun/concurrent/chapter17/WorkerThread.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter17; 2 | 3 | import java.util.Random; 4 | 5 | /*************************************** 6 | * @author:Alex Wang 7 | * @Date:2017/3/25 QQ:532500648 8 | * QQ交流群:286081824 9 | ***************************************/ 10 | public class WorkerThread extends Thread { 11 | 12 | private final Channel channel; 13 | 14 | private static final Random random = new Random(System.currentTimeMillis()); 15 | 16 | public WorkerThread(String name, Channel channel) { 17 | super(name); 18 | this.channel = channel; 19 | } 20 | 21 | @Override 22 | public void run() { 23 | while (true) { 24 | channel.take().execute(); 25 | try { 26 | Thread.sleep(random.nextInt(1_000)); 27 | } catch (InterruptedException e) { 28 | e.printStackTrace(); 29 | } 30 | } 31 | } 32 | } -------------------------------------------------------------------------------- /design_pattern/src/main/java/com/wangwenjun/concurrent/chapter18/DisplayClientThread.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter18; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/3/26 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public class DisplayClientThread extends Thread { 9 | 10 | private final ActiveObject activeObject; 11 | 12 | public DisplayClientThread(String name, ActiveObject activeObject) { 13 | super(name); 14 | this.activeObject = activeObject; 15 | } 16 | 17 | @Override 18 | public void run() { 19 | try { 20 | for (int i = 0; true; i++) { 21 | String text = Thread.currentThread().getName() + "=>" + i; 22 | activeObject.displayString(text); 23 | Thread.sleep(200); 24 | } 25 | } catch (Exception e) { 26 | e.printStackTrace(); 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /design_pattern/src/main/java/com/wangwenjun/concurrent/chapter4/Subject.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter4; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | /*************************************** 7 | * @author:Alex Wang 8 | * @Date:2017/3/18 QQ:532500648 9 | * QQ交流群:286081824 10 | ***************************************/ 11 | public class Subject { 12 | 13 | private List observers = new ArrayList<>(); 14 | 15 | private int state; 16 | 17 | public int getState() { 18 | return this.state; 19 | } 20 | 21 | public void setState(int state) { 22 | if (state == this.state) { 23 | return; 24 | } 25 | this.state = state; 26 | notifyAllObserver(); 27 | } 28 | 29 | public void attach(Observer observer) { 30 | observers.add(observer); 31 | } 32 | 33 | private void notifyAllObserver() { 34 | observers.stream().forEach(Observer::update); 35 | } 36 | } -------------------------------------------------------------------------------- /sharing/src/main/java/com/wangwenjun/concurrency/chapter8/DeadLockTest.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrency.chapter8; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/2/19 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public class DeadLockTest { 9 | public static void main(String[] args) { 10 | OtherService otherService = new OtherService(); 11 | DeadLock deadLock = new DeadLock(otherService); 12 | otherService.setDeadLock(deadLock); 13 | new Thread() { 14 | @Override 15 | public void run() { 16 | while (true) { 17 | deadLock.m1(); 18 | } 19 | } 20 | }.start(); 21 | 22 | new Thread() { 23 | @Override 24 | public void run() { 25 | while (true) 26 | otherService.s2(); 27 | } 28 | }.start(); 29 | } 30 | } -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter03/ThreadSleep.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter03; 2 | 3 | public class ThreadSleep 4 | { 5 | public static void main(String[] args) 6 | { 7 | new Thread(() -> 8 | { 9 | long startTime = System.currentTimeMillis(); 10 | sleep(2_000L); 11 | long endTime = System.currentTimeMillis(); 12 | System.out.println(String.format("Total spend %d ms", (endTime - startTime))); 13 | }).start(); 14 | 15 | long startTime = System.currentTimeMillis(); 16 | sleep(3_000L); 17 | long endTime = System.currentTimeMillis(); 18 | System.out.println(String.format("Main thread total spend %d ms", (endTime - startTime))); 19 | 20 | } 21 | 22 | private static void sleep(long ms) 23 | { 24 | try 25 | { 26 | Thread.sleep(ms); 27 | } catch (InterruptedException e) 28 | { 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter07/EmptyExceptionHandler.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter07; 2 | 3 | import java.util.concurrent.TimeUnit; 4 | 5 | public class EmptyExceptionHandler 6 | { 7 | public static void main(String[] args) 8 | { 9 | // get current thread's thread group 10 | ThreadGroup mainGroup = Thread.currentThread().getThreadGroup(); 11 | System.out.println(mainGroup.getName()); 12 | System.out.println(mainGroup.getParent()); 13 | System.out.println(mainGroup.getParent().getParent()); 14 | 15 | final Thread thread = new Thread(() -> 16 | { 17 | try 18 | { 19 | TimeUnit.SECONDS.sleep(2); 20 | } catch (InterruptedException e) 21 | { 22 | } 23 | 24 | //here will throw unchecked exception. 25 | System.out.println(1 / 0); 26 | }, "Test-Thread"); 27 | 28 | thread.start(); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter15/TaskLifecycle.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter15; 2 | 3 | public interface TaskLifecycle 4 | { 5 | void onStart(Thread thread); 6 | 7 | void onRunning(Thread thread); 8 | 9 | void onFinish(Thread thread, T result); 10 | 11 | void onError(Thread thread, Exception e); 12 | 13 | class EmptyLifecycle implements TaskLifecycle 14 | { 15 | 16 | @Override 17 | public void onStart(Thread thread) 18 | { 19 | //do nothing 20 | } 21 | 22 | @Override 23 | public void onRunning(Thread thread) 24 | { 25 | //do nothing 26 | } 27 | 28 | @Override 29 | public void onFinish(Thread thread, T result) 30 | { 31 | //do nothing 32 | } 33 | 34 | @Override 35 | public void onError(Thread thread, Exception e) 36 | { 37 | //do nothing 38 | } 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /design_pattern/src/main/java/com/wangwenjun/concurrent/chapter12/WaiterThread.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter12; 2 | 3 | import java.io.IOException; 4 | 5 | /*************************************** 6 | * @author:Alex Wang 7 | * @Date:2017/3/24 QQ:532500648 8 | * QQ交流群:286081824 9 | ***************************************/ 10 | public class WaiterThread extends Thread { 11 | 12 | private final BalkingData balkingData; 13 | 14 | public WaiterThread(BalkingData balkingData) { 15 | super("Waiter"); 16 | this.balkingData = balkingData; 17 | } 18 | 19 | @Override 20 | public void run() { 21 | for (int i = 0; i < 200; i++) { 22 | try { 23 | balkingData.save(); 24 | Thread.sleep(1_000L); 25 | } catch (IOException e) { 26 | e.printStackTrace(); 27 | } catch (InterruptedException e) { 28 | e.printStackTrace(); 29 | } 30 | } 31 | } 32 | } -------------------------------------------------------------------------------- /sharing/src/main/java/com/wangwenjun/concurrency/chapter7/SynchronizedTEst.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrency.chapter7; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/2/19 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public class SynchronizedTest { 9 | 10 | private final static Object LOCK = new Object(); 11 | 12 | public static void main(String[] args) { 13 | 14 | Runnable runnable = () -> { 15 | synchronized (LOCK) { 16 | try { 17 | Thread.sleep(200_000); 18 | } catch (InterruptedException e) { 19 | e.printStackTrace(); 20 | } 21 | } 22 | }; 23 | 24 | Thread t1 = new Thread(runnable); 25 | Thread t2 = new Thread(runnable); 26 | Thread t3 = new Thread(runnable); 27 | t1.start(); 28 | t2.start(); 29 | t3.start(); 30 | 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter20/GuardedSuspensionQueue.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter20; 2 | 3 | import java.util.LinkedList; 4 | 5 | public class GuardedSuspensionQueue 6 | { 7 | 8 | private final LinkedList queue = new LinkedList<>(); 9 | 10 | private final int LIMIT = 100; 11 | 12 | public void offer(Integer data) throws InterruptedException 13 | { 14 | synchronized (this) 15 | { 16 | while (queue.size() >= LIMIT) 17 | { 18 | this.wait(); 19 | } 20 | queue.addLast(data); 21 | this.notifyAll(); 22 | } 23 | } 24 | 25 | public Integer take() throws InterruptedException 26 | { 27 | synchronized (this) 28 | { 29 | while (queue.isEmpty()) 30 | { 31 | this.wait(); 32 | } 33 | this.notifyAll(); 34 | return queue.removeFirst(); 35 | } 36 | } 37 | } -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter19/FutureTask.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter19; 2 | 3 | public class FutureTask implements Future 4 | { 5 | 6 | private T result; 7 | 8 | private boolean isDone = false; 9 | 10 | private final Object LOCK = new Object(); 11 | 12 | 13 | @Override 14 | public T get() throws InterruptedException 15 | { 16 | synchronized (LOCK) 17 | { 18 | while (!isDone) 19 | { 20 | LOCK.wait(); 21 | } 22 | 23 | return result; 24 | } 25 | } 26 | 27 | protected void finish(T result) 28 | { 29 | synchronized (LOCK) 30 | { 31 | if (isDone) 32 | return; 33 | 34 | this.result = result; 35 | this.isDone = true; 36 | LOCK.notifyAll(); 37 | } 38 | } 39 | 40 | @Override 41 | public boolean done() 42 | { 43 | return isDone; 44 | } 45 | } -------------------------------------------------------------------------------- /classLoader/src/main/java/com/wangwenjun/concurrent/classloader/chapter4/ClassLoaderTest.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.classloader.chapter4; 2 | 3 | import com.wangwenjun.concurrent.classloader.chapter3.MyClassLoader; 4 | 5 | import java.lang.reflect.Method; 6 | 7 | /*************************************** 8 | * @author:Alex Wang 9 | * @Date:2017/4/4 QQ:532500648 10 | * QQ交流群:286081824 11 | ***************************************/ 12 | public class ClassLoaderTest { 13 | public static void main(String[] args) throws Exception { 14 | 15 | DecryptClassLoader classLoader = new DecryptClassLoader(); 16 | Class aClass = classLoader.loadClass("com.wangwenjun.concurrent.classloader.chapter3.MyObject"); 17 | System.out.println(aClass); 18 | 19 | Object obj = aClass.newInstance(); 20 | Method method = aClass.getMethod("hello", new Class[]{}); 21 | Object result = method.invoke(obj, new Object[]{}); 22 | System.out.println(result); 23 | 24 | } 25 | } -------------------------------------------------------------------------------- /design_pattern/src/main/java/com/wangwenjun/concurrent/chapter17/TransportThread.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter17; 2 | 3 | import java.util.Random; 4 | 5 | /*************************************** 6 | * @author:Alex Wang 7 | * @Date:2017/3/25 QQ:532500648 8 | * QQ交流群:286081824 9 | ***************************************/ 10 | public class TransportThread extends Thread { 11 | private final Channel channel; 12 | 13 | private static final Random random = new Random(System.currentTimeMillis()); 14 | 15 | public TransportThread(String name, Channel channel) { 16 | super(name); 17 | this.channel = channel; 18 | } 19 | 20 | @Override 21 | public void run() { 22 | try { 23 | for (int i = 0; true; i++) { 24 | Request request = new Request(getName(), i); 25 | this.channel.put(request); 26 | Thread.sleep(random.nextInt(1_000)); 27 | } 28 | } catch (Exception e) { 29 | } 30 | } 31 | } -------------------------------------------------------------------------------- /design_pattern/src/main/java/com/wangwenjun/concurrent/chapter18/Servant.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter18; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/3/26 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | class Servant implements ActiveObject { 9 | 10 | @Override 11 | public Result makeString(int count, char fillChar) { 12 | char[] buf = new char[count]; 13 | for (int i = 0; i < count; i++) { 14 | buf[i] = fillChar; 15 | try { 16 | Thread.sleep(10); 17 | } catch (Exception e) { 18 | 19 | } 20 | } 21 | return new RealResult(new String(buf)); 22 | } 23 | 24 | @Override 25 | public void displayString(String text) { 26 | try { 27 | System.out.println("Display:" + text); 28 | Thread.sleep(10); 29 | } catch (Exception e) { 30 | e.printStackTrace(); 31 | } 32 | } 33 | } -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter29/AsyncChannel.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter29; 2 | 3 | import java.util.concurrent.ExecutorService; 4 | import java.util.concurrent.Executors; 5 | 6 | public abstract class AsyncChannel implements Channel 7 | { 8 | private final ExecutorService executorService; 9 | 10 | public AsyncChannel() 11 | { 12 | this(Executors.newFixedThreadPool(Runtime.getRuntime() 13 | .availableProcessors() * 2)); 14 | } 15 | 16 | public AsyncChannel(ExecutorService executorService) 17 | { 18 | this.executorService = executorService; 19 | } 20 | 21 | @Override 22 | public final void dispatch(Event message) 23 | { 24 | executorService.submit(() -> this.handle(message)); 25 | } 26 | 27 | protected abstract void handle(Event message); 28 | 29 | 30 | void stop() 31 | { 32 | if (null != executorService && !executorService.isShutdown()) 33 | executorService.shutdown(); 34 | } 35 | } -------------------------------------------------------------------------------- /sharing/src/main/java/com/wangwenjun/concurrency/chapter6/ThreadCloseGraceful.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrency.chapter6; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/2/19 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public class ThreadCloseGraceful { 9 | 10 | private static class Worker extends Thread { 11 | private volatile boolean start = true; 12 | 13 | @Override 14 | public void run() { 15 | while (start) { 16 | // 17 | } 18 | } 19 | 20 | public void shutdown() { 21 | this.start = false; 22 | } 23 | } 24 | 25 | public static void main(String[] args) { 26 | Worker worker = new Worker(); 27 | worker.start(); 28 | 29 | try { 30 | Thread.sleep(10000); 31 | } catch (InterruptedException e) { 32 | e.printStackTrace(); 33 | } 34 | 35 | worker.shutdown(); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /sharing/src/main/java/com/wangwenjun/concurrency/chapter6/ThreadCloseGraceful2.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrency.chapter6; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/2/19 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public class ThreadCloseGraceful2 { 9 | private static class Worker extends Thread { 10 | 11 | @Override 12 | public void run() { 13 | while (true) { 14 | if (Thread.interrupted()) 15 | break; 16 | } 17 | //------------- 18 | //------------- 19 | //------------- 20 | } 21 | } 22 | 23 | public static void main(String[] args) { 24 | Worker worker = new Worker(); 25 | worker.start(); 26 | 27 | try { 28 | Thread.sleep(3000); 29 | } catch (InterruptedException e) { 30 | e.printStackTrace(); 31 | } 32 | 33 | worker.interrupt(); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter28/AsyncEventBus.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter28; 2 | 3 | import java.util.concurrent.ThreadPoolExecutor; 4 | 5 | /*************************************** 6 | * @author:Alex Wang 7 | * @Date:2017/10/21 8 | * 532500648 9 | ***************************************/ 10 | public class AsyncEventBus extends EventBus 11 | { 12 | 13 | AsyncEventBus(String busName, EventExceptionHandler exceptionHandler, ThreadPoolExecutor executor) 14 | { 15 | super(busName, exceptionHandler, executor); 16 | } 17 | 18 | 19 | public AsyncEventBus(String busName, ThreadPoolExecutor executor) 20 | { 21 | this(busName, null, executor); 22 | } 23 | 24 | public AsyncEventBus(ThreadPoolExecutor executor) 25 | { 26 | this("default-async", null, executor); 27 | } 28 | 29 | public AsyncEventBus(EventExceptionHandler exceptionHandler, ThreadPoolExecutor executor) 30 | { 31 | this("default-async", exceptionHandler, executor); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter29/EventDispatcher.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter29; 2 | 3 | import java.util.HashMap; 4 | import java.util.Map; 5 | 6 | public class EventDispatcher implements DynamicRouter 7 | { 8 | private final Map, Channel> routerTable; 9 | 10 | public EventDispatcher() 11 | { 12 | this.routerTable = new HashMap<>(); 13 | } 14 | 15 | @Override 16 | public void dispatch(Message message) 17 | { 18 | if (routerTable.containsKey(message.getType())) 19 | { 20 | routerTable.get(message.getType()).dispatch(message); 21 | } else 22 | throw new MessageMatcherException("Can't match the channel for [" + message.getType() + "] type"); 23 | } 24 | 25 | @Override 26 | public void registerChannel(Class messageType, 27 | Channel channel) 28 | { 29 | this.routerTable.put(messageType, channel); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /design_pattern/src/main/java/com/wangwenjun/concurrent/chapter8/FutureService.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter8; 2 | 3 | import java.util.function.Consumer; 4 | 5 | /*************************************** 6 | * @author:Alex Wang 7 | * @Date:2017/3/22 QQ:532500648 8 | * QQ交流群:286081824 9 | ***************************************/ 10 | public class FutureService { 11 | 12 | public Future submit(final FutureTask task) { 13 | AsynFuture asynFuture = new AsynFuture<>(); 14 | new Thread(() -> { 15 | T result = task.call(); 16 | asynFuture.done(result); 17 | }).start(); 18 | return asynFuture; 19 | } 20 | 21 | public Future submit(final FutureTask task, final Consumer consumer) { 22 | AsynFuture asynFuture = new AsynFuture<>(); 23 | new Thread(() -> { 24 | T result = task.call(); 25 | asynFuture.done(result); 26 | consumer.accept(result); 27 | }).start(); 28 | return asynFuture; 29 | } 30 | } -------------------------------------------------------------------------------- /sharing/src/main/java/com/wangwenjun/concurrency/chapter7/TicketWindowRunnable.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrency.chapter7; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/2/15 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public class TicketWindowRunnable implements Runnable { 9 | 10 | private int index = 1; 11 | 12 | private final static int MAX = 500; 13 | 14 | private final Object MONITOR = new Object(); 15 | 16 | @Override 17 | public void run() { 18 | 19 | while (true) { 20 | //1 21 | synchronized (MONITOR) { 22 | if (index > MAX) 23 | break; 24 | try { 25 | Thread.sleep(5); 26 | } catch (InterruptedException e) { 27 | e.printStackTrace(); 28 | } 29 | System.out.println(Thread.currentThread() + " 的号码是:" + (index++)); 30 | } 31 | //2 32 | } 33 | } 34 | } -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter27/FindOrderDetailsMessage.java: -------------------------------------------------------------------------------- 1 | //package com.wangwenjun.concurrent.chapter27; 2 | // 3 | //import com.wangwenjun.concurrent.chapter19.Future; 4 | // 5 | //import java.util.Map; 6 | // 7 | //public class FindOrderDetailsMessage extends MethodMessage 8 | //{ 9 | // public FindOrderDetailsMessage(Map params 10 | // , OrderService orderService) 11 | // { 12 | // super(params, orderService); 13 | // } 14 | // 15 | // @Override 16 | // public void execute() 17 | // { 18 | // Future realFuture = orderService.findOrderDetails((Long) params.get("orderId")); 19 | // ActiveFuture activeFuture = (ActiveFuture) params.get("activeFuture"); 20 | // try 21 | // { 22 | // String result = realFuture.get(); 23 | // activeFuture.finish(result); 24 | // } catch (InterruptedException e) 25 | // { 26 | // e.printStackTrace(); 27 | // activeFuture.finish(null); 28 | // } 29 | // } 30 | //} -------------------------------------------------------------------------------- /design_pattern/src/main/java/com/wangwenjun/concurrent/chapter9/RequestQueue.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter9; 2 | 3 | import java.util.LinkedList; 4 | 5 | /*************************************** 6 | * @author:Alex Wang 7 | * @Date:2017/3/23 QQ:532500648 8 | * QQ交流群:286081824 9 | ***************************************/ 10 | public class RequestQueue { 11 | 12 | private final LinkedList queue = new LinkedList<>(); 13 | 14 | public Request getRequest() { 15 | synchronized (queue) { 16 | while (queue.size() <= 0) { 17 | try { 18 | queue.wait(); 19 | } catch (InterruptedException e) { 20 | return null; 21 | } 22 | } 23 | 24 | Request request = queue.removeFirst(); 25 | return request; 26 | } 27 | } 28 | 29 | public void putRequest(Request request) { 30 | synchronized (queue) { 31 | queue.addLast(request); 32 | queue.notifyAll(); 33 | } 34 | } 35 | } -------------------------------------------------------------------------------- /sharing/src/main/java/com/wangwenjun/concurrency/chapter11/ThreadException.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrency.chapter11; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/2/24 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public class ThreadException { 9 | private final static int A = 10; 10 | private final static int B = 0; 11 | 12 | 13 | public static void main(String[] args) { 14 | 15 | //new Test1().test(); 16 | 17 | Thread t = new Thread(() -> { 18 | try { 19 | Thread.sleep(5_000L); 20 | int result = A / B; 21 | System.out.println(result); 22 | } catch (InterruptedException e) { 23 | e.printStackTrace(); 24 | } 25 | }); 26 | t.start(); 27 | 28 | // t.setUncaughtExceptionHandler((thread, e) -> { 29 | // System.out.println(e); 30 | // System.out.println(thread); 31 | // }); 32 | // t.start(); 33 | } 34 | } -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter10/NameSpace.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter10; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/11/21 6 | * QQ: 532500648 7 | * QQ群:463962286 8 | ***************************************/ 9 | public class NameSpace 10 | { 11 | public static void main(String[] args) 12 | throws ClassNotFoundException 13 | { 14 | MyClassLoader classLoader1 = new MyClassLoader("G:\\classloader1", null); 15 | MyClassLoader classLoader2 = new MyClassLoader("G:\\classloader1", null); 16 | Class aClass = classLoader1.loadClass("com.wangwenjun.concurrent.chapter10.Test"); 17 | Class bClass = classLoader2.loadClass("com.wangwenjun.concurrent.chapter10.Test"); 18 | System.out.println(aClass.getClassLoader()); 19 | System.out.println(bClass.getClassLoader()); 20 | System.out.println(aClass.hashCode()); 21 | System.out.println(bClass.hashCode()); 22 | System.out.println(aClass == bClass); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter15/ObservableThreadTest.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter15; 2 | 3 | import java.util.concurrent.TimeUnit; 4 | 5 | public class ObservableThreadTest 6 | { 7 | public static void main(String[] args) 8 | { 9 | final TaskLifecycle lifecycle = new TaskLifecycle.EmptyLifecycle() 10 | { 11 | @Override 12 | public void onFinish(Thread thread, String result) 13 | { 14 | System.out.println("The result is " + result); 15 | } 16 | }; 17 | 18 | Observable observableThread = new ObservableThread<>(lifecycle, () -> 19 | { 20 | try 21 | { 22 | TimeUnit.SECONDS.sleep(10); 23 | } catch (InterruptedException e) 24 | { 25 | e.printStackTrace(); 26 | } 27 | System.out.println(" finished done."); 28 | return "Hello Observer"; 29 | }); 30 | 31 | observableThread.start(); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter16/FlightSecurity.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter16; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/11/26 6 | * QQ: 532500648 7 | * QQ群:463962286 8 | ***************************************/ 9 | public class FlightSecurity 10 | { 11 | private int count = 0; 12 | //登机牌 13 | private String boardingPass = "null"; 14 | //身份证 15 | private String idCard = "null"; 16 | 17 | public synchronized void pass(String boardingPass, String idCard) 18 | { 19 | this.boardingPass = boardingPass; 20 | this.idCard = idCard; 21 | this.count++; 22 | check(); 23 | } 24 | 25 | private void check() 26 | { 27 | if (boardingPass.charAt(0) != idCard.charAt(0)) 28 | throw new RuntimeException("====Exception====" + toString()); 29 | } 30 | 31 | public String toString() 32 | { 33 | return "The " + count + " passengers,boardingPass [" + boardingPass + "],idCard [" + idCard + "]"; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /design_pattern/src/main/java/com/wangwenjun/concurrent/chapter18/ActiveObjectProxy.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter18; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/3/26 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | class ActiveObjectProxy implements ActiveObject { 9 | 10 | private final SchedulerThread schedulerThread; 11 | 12 | private final Servant servant; 13 | 14 | public ActiveObjectProxy(SchedulerThread schedulerThread, Servant servant) { 15 | this.schedulerThread = schedulerThread; 16 | this.servant = servant; 17 | } 18 | 19 | @Override 20 | public Result makeString(int count, char fillChar) { 21 | FutureResult future = new FutureResult(); 22 | schedulerThread.invoke(new MakeStringRequest(servant, future, count, fillChar)); 23 | return future; 24 | } 25 | 26 | @Override 27 | public void displayString(String text) { 28 | schedulerThread.invoke(new DisplayStringRequest(servant, text)); 29 | } 30 | } -------------------------------------------------------------------------------- /sharing/src/main/java/com/wangwenjun/concurrency/chapter2/TaxCalaculator.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrency.chapter2; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/2/15 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public class TaxCalaculator { 9 | 10 | private final double salary; 11 | 12 | private final double bonus; 13 | 14 | private final CalculatorStrategy calculatorStrategy; 15 | 16 | public TaxCalaculator(double salary, double bonus, CalculatorStrategy calculatorStrategy) { 17 | this.salary = salary; 18 | this.bonus = bonus; 19 | this.calculatorStrategy = calculatorStrategy; 20 | } 21 | 22 | protected double calcTax() { 23 | return calculatorStrategy.calculate(salary, bonus); 24 | } 25 | 26 | public double calculate() { 27 | return this.calcTax(); 28 | } 29 | 30 | public double getSalary() { 31 | return salary; 32 | } 33 | 34 | public double getBonus() { 35 | return bonus; 36 | } 37 | } -------------------------------------------------------------------------------- /classLoader/src/main/java/com/wangwenjun/concurrent/classloader/chapter4/SimpleEncrypt.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.classloader.chapter4; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/4/4 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public class SimpleEncrypt { 9 | 10 | private static final String plain = "Hello ClassLoader"; 11 | 12 | private static final byte ENCRYPT_FACTOR = (byte) 0xff; 13 | 14 | 15 | public static void main(String[] args) { 16 | byte[] bytes = plain.getBytes(); 17 | byte[] encrypt = new byte[bytes.length]; 18 | for (int i = 0; i < bytes.length; i++) { 19 | encrypt[i] = (byte) (bytes[i] ^ ENCRYPT_FACTOR); 20 | } 21 | System.out.println(new String(encrypt)); 22 | 23 | byte[] decrypt = new byte[encrypt.length]; 24 | for (int i = 0; i < encrypt.length; i++) { 25 | decrypt[i] = (byte) (encrypt[i] ^ ENCRYPT_FACTOR); 26 | } 27 | System.out.println(new String(decrypt)); 28 | } 29 | } -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter26/Worker.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter26; 2 | 3 | import java.util.Random; 4 | import java.util.concurrent.TimeUnit; 5 | 6 | public class Worker extends Thread 7 | { 8 | private final ProductionChannel channel; 9 | 10 | private final static Random random = 11 | new Random(System.currentTimeMillis()); 12 | 13 | public Worker(String workerName, ProductionChannel channel) 14 | { 15 | super(workerName); 16 | this.channel = channel; 17 | } 18 | 19 | @Override 20 | public void run() 21 | { 22 | while (true) 23 | { 24 | try 25 | { 26 | Production production = channel.takeProduction(); 27 | System.out.println(getName() + " process the " + production); 28 | production.create(); 29 | TimeUnit.SECONDS.sleep(random.nextInt(10)); 30 | } catch (InterruptedException e) 31 | { 32 | e.printStackTrace(); 33 | } 34 | } 35 | } 36 | } -------------------------------------------------------------------------------- /classLoader/src/main/java/com/wangwenjun/concurrent/classloader/chapter2/BootClassLoader.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.classloader.chapter2; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/4/2 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public class BootClassLoader { 9 | 10 | public static void main(String[] args) throws ClassNotFoundException { 11 | System.out.println(System.getProperty("sun.boot.class.path")); 12 | System.out.println(System.getProperty("java.ext.dirs")); 13 | 14 | 15 | Class klass = Class.forName("com.wangwenjun.concurrent.classloader.chapter2.SimpleObject"); 16 | System.out.println(klass.getClassLoader()); 17 | System.out.println(klass.getClassLoader().getParent()); 18 | System.out.println(klass.getClassLoader().getParent().getParent()); 19 | 20 | 21 | Class clazz = Class.forName("java.lang.String"); 22 | System.out.println(clazz); 23 | System.out.println(clazz.getClassLoader()); 24 | 25 | 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter08/DenyPolicy.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter08; 2 | 3 | public interface DenyPolicy 4 | { 5 | 6 | void reject(Runnable runnable, ThreadPool threadPool); 7 | 8 | 9 | class DiscardDenyPolicy implements DenyPolicy 10 | { 11 | 12 | @Override 13 | public void reject(Runnable runnable, ThreadPool threadPool) 14 | { 15 | //do nothing 16 | } 17 | } 18 | 19 | class AbortDenyPolicy implements DenyPolicy 20 | { 21 | 22 | @Override 23 | public void reject(Runnable runnable, ThreadPool threadPool) 24 | { 25 | throw new RunnableDenyException("The runnable " + runnable + " will be abort."); 26 | } 27 | } 28 | 29 | class RunnerDenyPolicy implements DenyPolicy 30 | { 31 | 32 | @Override 33 | public void reject(Runnable runnable, ThreadPool threadPool) 34 | { 35 | if (!threadPool.isShutdown()) 36 | { 37 | runnable.run(); 38 | } 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter05/SynchronizedDefect.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter05; 2 | 3 | import java.util.concurrent.TimeUnit; 4 | 5 | public class SynchronizedDefect 6 | { 7 | 8 | public synchronized void syncMethod() 9 | { 10 | try 11 | { 12 | TimeUnit.HOURS.sleep(1); 13 | } catch (InterruptedException e) 14 | { 15 | e.printStackTrace(); 16 | } 17 | } 18 | 19 | public static void main(String[] args) throws InterruptedException 20 | { 21 | SynchronizedDefect defect = new SynchronizedDefect(); 22 | Thread t1 = new Thread(defect::syncMethod, "T1"); 23 | //make sure the t1 started. 24 | t1.start(); 25 | TimeUnit.MILLISECONDS.sleep(2); 26 | 27 | Thread t2 = new Thread(defect::syncMethod, "T2"); 28 | t2.start(); 29 | //make sure the t2 started. 30 | TimeUnit.MILLISECONDS.sleep(2); 31 | t2.interrupt(); 32 | System.out.println(t2.isInterrupted()); 33 | System.out.println(t2.getState()); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /classLoader/src/main/java/com/wangwenjun/concurrent/classloader/chapter6/ThreadContextClassLoader.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.classloader.chapter6; 2 | 3 | import com.wangwenjun.concurrent.classloader.chapter3.MyClassLoader; 4 | 5 | import java.sql.Connection; 6 | import java.sql.DriverManager; 7 | import java.sql.SQLException; 8 | 9 | /*************************************** 10 | * @author:Alex Wang 11 | * @Date:2017/4/4 QQ:532500648 12 | * QQ交流群:286081824 13 | ***************************************/ 14 | public class ThreadContextClassLoader { 15 | 16 | public static void main(String[] args) throws ClassNotFoundException, SQLException { 17 | ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); 18 | System.out.println(contextClassLoader); 19 | 20 | Thread.currentThread().setContextClassLoader(new MyClassLoader()); 21 | System.out.println(Thread.currentThread().getContextClassLoader()); 22 | 23 | 24 | Class.forName("com.mysql.jdbc.Driver");//(---) 25 | Connection conn = DriverManager.getConnection(""); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter03/FlagThreadExit.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter03; 2 | 3 | import java.util.concurrent.TimeUnit; 4 | 5 | public class FlagThreadExit 6 | { 7 | 8 | static class MyTask extends Thread 9 | { 10 | 11 | private volatile boolean closed = false; 12 | 13 | @Override 14 | public void run() 15 | { 16 | System.out.println("I will start work"); 17 | while (!closed && !isInterrupted()) 18 | { 19 | //System.out.println("i am working."); 20 | } 21 | System.out.println("I will be exiting."); 22 | } 23 | 24 | public void close() 25 | { 26 | this.closed = true; 27 | this.interrupt(); 28 | } 29 | } 30 | 31 | public static void main(String[] args) throws InterruptedException 32 | { 33 | 34 | MyTask t = new MyTask(); 35 | t.start(); 36 | TimeUnit.SECONDS.sleep(1); 37 | System.out.println("System will be shutdown."); 38 | t.close(); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter21/ActionContext.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter21; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/12/7 6 | * QQ: 532500648 7 | * QQ群:463962286 8 | ***************************************/ 9 | public class ActionContext 10 | { 11 | private static final ThreadLocal configuration = 12 | ThreadLocal.withInitial(Configuration::new); 13 | 14 | private static final ThreadLocal otherResource = 15 | ThreadLocal.withInitial(OtherResource::new); 16 | 17 | public static void setConfiguration(Configuration conf) 18 | { 19 | configuration.set(conf); 20 | } 21 | 22 | public static Configuration getConfiguraiton() 23 | { 24 | return configuration.get(); 25 | } 26 | 27 | public static void setOtherResource(OtherResource oResource) 28 | { 29 | otherResource.set(oResource); 30 | } 31 | 32 | public static OtherResource getOtherResource() 33 | { 34 | return otherResource.get(); 35 | } 36 | } -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter28/Subscriber.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter28; 2 | 3 | import java.lang.reflect.Method; 4 | 5 | /*************************************** 6 | * @author:Alex Wang 7 | * @Date:2017/10/21 8 | * 532500648 9 | ***************************************/ 10 | public class Subscriber 11 | { 12 | 13 | private final Object subscribeObject; 14 | 15 | private final Method subscribeMethod; 16 | 17 | private boolean disable = false; 18 | 19 | public Subscriber(Object subscribeObject, Method subscribeMethod) 20 | { 21 | this.subscribeObject = subscribeObject; 22 | this.subscribeMethod = subscribeMethod; 23 | } 24 | 25 | public Object getSubscribeObject() 26 | { 27 | return subscribeObject; 28 | } 29 | 30 | public Method getSubscribeMethod() 31 | { 32 | return subscribeMethod; 33 | } 34 | 35 | public boolean isDisable() 36 | { 37 | return disable; 38 | } 39 | 40 | public void setDisable(boolean disable) 41 | { 42 | this.disable = disable; 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /classLoader/src/main/java/com/wangwenjun/concurrent/classloader/chapter1/ClinitThreadTest.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.classloader.chapter1; 2 | 3 | import java.util.concurrent.atomic.AtomicBoolean; 4 | 5 | /*************************************** 6 | * @author:Alex Wang 7 | * @Date:2017/4/2 QQ:532500648 8 | * QQ交流群:286081824 9 | ***************************************/ 10 | public class ClinitThreadTest { 11 | 12 | public static void main(String[] args) { 13 | 14 | // System.out.println(System.getProperty("sun.boot.class.path")); 15 | // 16 | // new Thread(() -> new SimpleObject()).start(); 17 | // 18 | // new Thread(() -> new SimpleObject()).start(); 19 | } 20 | 21 | static class SimpleObject { 22 | 23 | private static AtomicBoolean init = new AtomicBoolean(true); 24 | 25 | static { 26 | System.out.println(Thread.currentThread().getName() + " I will be initial"); 27 | while (init.get()) { 28 | 29 | } 30 | System.out.println(Thread.currentThread().getName() + " I am finished initial."); 31 | } 32 | } 33 | } 34 | 35 | -------------------------------------------------------------------------------- /design_pattern/src/main/java/com/wangwenjun/concurrent/chapter5/Gate.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter5; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/3/19 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | 9 | /** 10 | * SharedResource 11 | */ 12 | public class Gate { 13 | private int counter = 0; 14 | private String name = "Nobody"; 15 | private String address = "Nowhere"; 16 | 17 | /** 18 | * 临界值 19 | * 20 | * @param name 21 | * @param address 22 | */ 23 | public synchronized void pass(String name, String address) { 24 | this.counter++; 25 | /*race*/ 26 | this.name = name; 27 | this.address = address; 28 | verify(); 29 | } 30 | 31 | private void verify() { 32 | if (this.name.charAt(0) != this.address.charAt(0)) { 33 | System.out.println("*******BROKEN********" + toString()); 34 | } 35 | } 36 | 37 | public synchronized String toString() { 38 | return "No." + counter + ":" + name + "," + address; 39 | } 40 | } -------------------------------------------------------------------------------- /design_pattern/src/main/java/com/wangwenjun/concurrent/chapter10/ThreadLocalSimulator.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter10; 2 | 3 | import java.util.HashMap; 4 | import java.util.Map; 5 | 6 | /*************************************** 7 | * @author:Alex Wang 8 | * @Date:2017/3/23 QQ:532500648 9 | * QQ交流群:286081824 10 | ***************************************/ 11 | 12 | /** 13 | * 始终已当前线程作为Key值 14 | * 15 | * @param 16 | */ 17 | public class ThreadLocalSimulator { 18 | 19 | private final Map storage = new HashMap<>(); 20 | 21 | public void set(T t) { 22 | synchronized (this) { 23 | Thread key = Thread.currentThread(); 24 | storage.put(key, t); 25 | } 26 | } 27 | 28 | 29 | public T get() { 30 | synchronized (this) { 31 | Thread key = Thread.currentThread(); 32 | T value = storage.get(key); 33 | if (value == null) { 34 | return initialValue(); 35 | } 36 | return value; 37 | } 38 | } 39 | 40 | public T initialValue() { 41 | return null; 42 | } 43 | } -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter05/EventClient.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter05; 2 | 3 | import java.util.concurrent.TimeUnit; 4 | 5 | public class EventClient 6 | { 7 | 8 | public static void main(String[] args) 9 | { 10 | final EventQueue eventQueue = new EventQueue(); 11 | for (int i = 0; i < 3; i++) 12 | new Thread(() -> 13 | { 14 | for (; ; ) 15 | { 16 | eventQueue.offer(new EventQueue.Event()); 17 | } 18 | }, "Producer").start(); 19 | 20 | for (int i = 0; i < 3; i++) 21 | new Thread(() -> 22 | { 23 | for (; ; ) 24 | { 25 | eventQueue.take(); 26 | /*try 27 | { 28 | TimeUnit.MILLISECONDS.sleep(10); 29 | } catch (InterruptedException e) 30 | { 31 | e.printStackTrace(); 32 | }*/ 33 | } 34 | }, "Consumer").start(); 35 | 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter01/RecordQuery.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter01; 2 | 3 | import java.sql.Connection; 4 | import java.sql.PreparedStatement; 5 | import java.sql.ResultSet; 6 | import java.sql.SQLException; 7 | 8 | /*************************************** 9 | * @author:Alex Wang 10 | * @Date:2017/10/22 11 | * 532500648 12 | ***************************************/ 13 | public class RecordQuery 14 | { 15 | 16 | private final Connection connection; 17 | 18 | public RecordQuery(Connection connection) 19 | { 20 | this.connection = connection; 21 | } 22 | 23 | public T query(RowHandler handler, String sql, Object... params) 24 | throws SQLException 25 | { 26 | try (PreparedStatement stmt = connection.prepareStatement(sql)) 27 | { 28 | int index = 1; 29 | for (Object param : params) 30 | { 31 | stmt.setObject(index++, param); 32 | } 33 | 34 | ResultSet resultSet = stmt.executeQuery(); 35 | return handler.handle(resultSet); 36 | } 37 | } 38 | 39 | } 40 | -------------------------------------------------------------------------------- /design_pattern/src/main/java/com/wangwenjun/concurrent/chapter18/MakerClientThread.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter18; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/3/26 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public class MakerClientThread extends Thread { 9 | 10 | private final ActiveObject activeObject; 11 | private final char fillChar; 12 | 13 | public MakerClientThread(ActiveObject activeObject, String name) { 14 | super(name); 15 | this.activeObject = activeObject; 16 | this.fillChar = name.charAt(0); 17 | } 18 | 19 | @Override 20 | public void run() { 21 | try { 22 | for(int i = 0;true;i++){ 23 | Result result = activeObject.makeString(i + 1, fillChar); 24 | Thread.sleep(20); 25 | String value = (String) result.getResultValue(); 26 | System.out.println(Thread.currentThread().getName()+": value="+value); 27 | } 28 | } catch (Exception e) { 29 | e.printStackTrace(); 30 | } 31 | } 32 | } -------------------------------------------------------------------------------- /design_pattern/src/main/java/com/wangwenjun/concurrent/chapter9/ClientThread.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter9; 2 | 3 | import java.util.Random; 4 | 5 | /*************************************** 6 | * @author:Alex Wang 7 | * @Date:2017/3/23 QQ:532500648 8 | * QQ交流群:286081824 9 | ***************************************/ 10 | public class ClientThread extends Thread { 11 | 12 | private final RequestQueue queue; 13 | 14 | private final Random random; 15 | 16 | private final String sendValue; 17 | 18 | public ClientThread(RequestQueue queue, String sendValue) { 19 | this.queue = queue; 20 | this.sendValue = sendValue; 21 | random = new Random(System.currentTimeMillis()); 22 | } 23 | 24 | @Override 25 | public void run() { 26 | for (int i = 0; i < 10; i++) { 27 | System.out.println("Client -> request " + sendValue); 28 | queue.putRequest(new Request(sendValue)); 29 | try { 30 | Thread.sleep(random.nextInt(1000)); 31 | } catch (InterruptedException e) { 32 | e.printStackTrace(); 33 | } 34 | } 35 | } 36 | } -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter04/TicketWindowRunnable.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter04; 2 | 3 | public class TicketWindowRunnable implements Runnable 4 | { 5 | 6 | private int index = 1; 7 | 8 | private final static int MAX = 500; 9 | 10 | private final static Object MUTEX = new Object(); 11 | 12 | @Override 13 | public void run() 14 | { 15 | synchronized (MUTEX) 16 | { 17 | while (index <= MAX) 18 | { 19 | System.out.println(Thread.currentThread() + " 的号码是:" + (index++)); 20 | } 21 | } 22 | } 23 | 24 | public static void main(String[] args) 25 | { 26 | final TicketWindowRunnable task = new TicketWindowRunnable(); 27 | 28 | Thread windowThread1 = new Thread(task, "一号窗口"); 29 | Thread windowThread2 = new Thread(task, "二号窗口"); 30 | Thread windowThread3 = new Thread(task, "三号窗口"); 31 | Thread windowThread4 = new Thread(task, "四号窗口"); 32 | windowThread1.start(); 33 | windowThread2.start(); 34 | windowThread3.start(); 35 | windowThread4.start(); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter03/YieldVsSleep.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter03; 2 | 3 | import java.util.Scanner; 4 | import java.util.stream.IntStream; 5 | 6 | public class YieldVsSleep 7 | { 8 | private final static Object LOCK = new Object(); 9 | 10 | public static void main(String[] args) throws InterruptedException 11 | { 12 | /* for (int i = 0; i < 10; i++) 13 | { 14 | new Thread(() -> 15 | { 16 | Scanner scanner = new Scanner(System.in); 17 | scanner.next(); 18 | }).start(); 19 | } 20 | Thread.sleep(20);*/ 21 | IntStream.range(0, 2).mapToObj(x -> new Thread(() -> monitor(x), "MyThread-" + x)) 22 | .forEach(Thread::start); 23 | } 24 | 25 | private static void monitor(int x) 26 | { 27 | if (x == 0) 28 | Thread.yield(); 29 | System.out.println(Thread.currentThread().getName() + " enter."); 30 | 31 | 32 | System.out.println(Thread.currentThread().getName() + " do task."); 33 | System.out.println(Thread.currentThread().getName() + " leave."); 34 | } 35 | } -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter02/ThreadCounter.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter02; 2 | 3 | 4 | import java.util.concurrent.TimeUnit; 5 | import java.util.concurrent.atomic.AtomicInteger; 6 | 7 | public class ThreadCounter extends Thread 8 | { 9 | 10 | final static AtomicInteger counter = new AtomicInteger(0); 11 | 12 | public static void main(String[] args) 13 | { 14 | 15 | try 16 | { 17 | while (true) 18 | { 19 | new ThreadCounter().start(); 20 | } 21 | } catch (Throwable e) 22 | { 23 | System.out.println("failed At=>" + counter.get()); 24 | System.exit(1); 25 | } 26 | 27 | // System.out.println((3 * 1024 * 1024 - 1024 * 1024 - 130 * 1024)/325); 28 | } 29 | 30 | @Override 31 | public void run() 32 | { 33 | try 34 | { 35 | System.out.println("The " + counter.getAndIncrement() + " thread be created."); 36 | TimeUnit.MINUTES.sleep(10); 37 | } catch (InterruptedException e) 38 | { 39 | e.printStackTrace(); 40 | } 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter04/HashMapDeadLock.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter04; 2 | 3 | import java.util.Collections; 4 | import java.util.HashMap; 5 | import java.util.concurrent.TimeUnit; 6 | 7 | public class HashMapDeadLock 8 | { 9 | private final HashMap map = new HashMap<>(); 10 | 11 | public void add(String key, String value) 12 | { 13 | this.map.put(key, value); 14 | } 15 | 16 | public static void main(String[] args) 17 | { 18 | 19 | 20 | final HashMapDeadLock hmdl = new HashMapDeadLock(); 21 | for (int x = 0; x < 2; x++) 22 | new Thread(() -> 23 | { 24 | for (int i = 1; i < Integer.MAX_VALUE; i++) 25 | { 26 | hmdl.add(String.valueOf(i), String.valueOf(i)); 27 | /*try 28 | { 29 | TimeUnit.MILLISECONDS.sleep(1); 30 | } catch (InterruptedException e) 31 | { 32 | e.printStackTrace(); 33 | }*/ 34 | } 35 | }).start(); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /classLoader/src/main/java/com/wangwenjun/concurrent/classloader/chapter5/RuntimePackage.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.classloader.chapter5; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/4/4 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public class RuntimePackage { 9 | //RuntimePackage 10 | //com.wangwenjun.concurrent.classloader.chapter5 11 | //Boot.Ext.App.com.wangwenjun.concurrent.classloader.chapter5 12 | 13 | //Boot.Ext.App.com.wangwenjun.concurrent.classloader.chapter5.SimpleClassLoaderTest 14 | //Boot.Ext.App.SimpleClassLoader.com.wangwenjun.concurrent.classloader.chapter5.SimpleClassLoaderTest 15 | 16 | public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException { 17 | SimpleClassLoader simpleClassLoader = new SimpleClassLoader(); 18 | Class aClass = simpleClassLoader.loadClass("com.wangwenjun.concurrent.classloader.chapter5.SimpleObject"); 19 | //sSystem.out.println(aClass.getClassLoader()); 20 | SimpleObject simpleObject = (SimpleObject) aClass.newInstance(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /classLoader/src/main/java/com/wangwenjun/concurrent/classloader/chapter3/MyClassLoaderTest2.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.classloader.chapter3; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/4/2 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | 9 | /** 10 | * 1.类加载器的委托是优先交给父亲加载器先去尝试加载 11 | * 2.父加载器和子加载器其实是一种包装关系,或者包含关系 12 | */ 13 | public class MyClassLoaderTest2 { 14 | public static void main(String[] args) throws ClassNotFoundException { 15 | MyClassLoader classLoader1 = new MyClassLoader("MyClassLoader-1"); 16 | MyClassLoader classLoader2 = new MyClassLoader("MyClassLoader-2"); 17 | classLoader2.setDir("G:\\Teaching\\app\\classloader2"); 18 | 19 | Class aClass = classLoader1.loadClass("com.wangwenjun.concurrent.classloader.chapter3.MyObject"); 20 | System.out.println(aClass.hashCode()); 21 | Class aClass2 = classLoader2.loadClass("com.wangwenjun.concurrent.classloader.chapter3.MyObject"); 22 | System.out.println(aClass2.hashCode()); 23 | //sSystem.out.println(((MyClassLoader) aClass.getClassLoader()).getClassLoaderName()); 24 | } 25 | } -------------------------------------------------------------------------------- /design_pattern/src/main/java/com/wangwenjun/concurrent/chapter12/CustomerThread.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter12; 2 | 3 | import java.io.IOException; 4 | import java.util.Random; 5 | 6 | /*************************************** 7 | * @author:Alex Wang 8 | * @Date:2017/3/24 QQ:532500648 9 | * QQ交流群:286081824 10 | ***************************************/ 11 | public class CustomerThread extends Thread { 12 | 13 | private final BalkingData balkingData; 14 | 15 | private final Random random = new Random(System.currentTimeMillis()); 16 | 17 | public CustomerThread(BalkingData balkingData) { 18 | super("Customer"); 19 | this.balkingData = balkingData; 20 | } 21 | 22 | @Override 23 | public void run() { 24 | try { 25 | balkingData.save(); 26 | for (int i = 0; i < 20; i++) { 27 | balkingData.change("No." + i); 28 | Thread.sleep(random.nextInt(1000)); 29 | balkingData.save(); 30 | } 31 | } catch (IOException e) { 32 | e.printStackTrace(); 33 | } catch (InterruptedException e) { 34 | e.printStackTrace(); 35 | } 36 | } 37 | } -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter06/ThreadGroupEnumerateThreads.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter06; 2 | 3 | import java.util.concurrent.TimeUnit; 4 | 5 | public class ThreadGroupEnumerateThreads 6 | { 7 | public static void main(String[] args) 8 | throws InterruptedException 9 | { 10 | 11 | ThreadGroup myGroup = new ThreadGroup("MyGroup"); 12 | Thread thread = new Thread(myGroup, () -> 13 | { 14 | while (true) 15 | { 16 | try 17 | { 18 | TimeUnit.SECONDS.sleep(1); 19 | } catch (InterruptedException e) 20 | { 21 | } 22 | } 23 | }, "MyThread"); 24 | thread.start(); 25 | 26 | TimeUnit.MILLISECONDS.sleep(2); 27 | ThreadGroup mainGroup = Thread.currentThread().getThreadGroup(); 28 | 29 | 30 | Thread[] list = new Thread[mainGroup.activeCount()]; 31 | int recurseSize = mainGroup.enumerate(list); 32 | System.out.println(recurseSize); 33 | 34 | recurseSize = mainGroup.enumerate(list, false); 35 | System.out.println(recurseSize); 36 | } 37 | } -------------------------------------------------------------------------------- /book/src/main/java/com/wangwenjun/concurrent/chapter29/UserChatThread.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter29; 2 | 3 | import java.util.concurrent.TimeUnit; 4 | 5 | import static java.util.concurrent.ThreadLocalRandom.current; 6 | 7 | public class UserChatThread extends Thread 8 | { 9 | private final User user; 10 | private final AsyncEventDispatcher dispatcher; 11 | 12 | public UserChatThread(User user, AsyncEventDispatcher dispatcher) 13 | { 14 | super(user.getName()); 15 | this.user = user; 16 | this.dispatcher = dispatcher; 17 | } 18 | 19 | @Override 20 | public void run() 21 | { 22 | try 23 | { 24 | dispatcher.dispatch(new UserOnlineEvent(user)); 25 | for (int i = 0; i < 5; i++) 26 | { 27 | dispatcher.dispatch(new UserChatEvent(user, getName() + "-Hello-" + i)); 28 | TimeUnit.SECONDS.sleep(current().nextInt(10)); 29 | } 30 | } catch (InterruptedException e) 31 | { 32 | e.printStackTrace(); 33 | } finally 34 | { 35 | dispatcher.dispatch(new UserOfflineEvent(user)); 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /design_pattern/src/main/java/com/wangwenjun/concurrent/chapter13/ConsumerThread.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrent.chapter13; 2 | 3 | import java.util.Random; 4 | import java.util.concurrent.atomic.AtomicInteger; 5 | 6 | /*************************************** 7 | * @author:Alex Wang 8 | * @Date:2017/3/24 QQ:532500648 9 | * QQ交流群:286081824 10 | ***************************************/ 11 | public class ConsumerThread extends Thread { 12 | 13 | private final MessageQueue messageQueue; 14 | 15 | private final static Random random = new Random(System.currentTimeMillis()); 16 | 17 | public ConsumerThread(MessageQueue messageQueue, int seq) { 18 | super("Consumer-" + seq); 19 | this.messageQueue = messageQueue; 20 | } 21 | 22 | @Override 23 | public void run() { 24 | while (true) { 25 | try { 26 | Message message = messageQueue.take(); 27 | System.out.println(Thread.currentThread().getName() + " take a message " + message.getData()); 28 | Thread.sleep(random.nextInt(1000)); 29 | } catch (InterruptedException e) { 30 | break; 31 | } 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /sharing/src/main/java/com/wangwenjun/concurrency/chapter10/SynchronizedProblem.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrency.chapter10; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/2/22 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public class SynchronizedProblem { 9 | 10 | public static void main(String[] args) throws InterruptedException { 11 | 12 | new Thread() { 13 | @Override 14 | public void run() { 15 | SynchronizedProblem.run(); 16 | } 17 | }.start(); 18 | 19 | Thread.sleep(1000); 20 | 21 | Thread t2 = new Thread() { 22 | @Override 23 | public void run() { 24 | // /sdfsdfsd 25 | SynchronizedProblem.run(); 26 | //sdfsdfsd 27 | } 28 | }; 29 | t2.start(); 30 | Thread.sleep(2000); 31 | t2.interrupt(); 32 | System.out.println(t2.isInterrupted()); 33 | } 34 | 35 | private synchronized static void run() { 36 | System.out.println(Thread.currentThread()); 37 | while (true) { 38 | 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /sharing/src/main/java/com/wangwenjun/concurrency/chapter3/CreateThread.java: -------------------------------------------------------------------------------- 1 | package com.wangwenjun.concurrency.chapter3; 2 | 3 | /*************************************** 4 | * @author:Alex Wang 5 | * @Date:2017/2/16 QQ:532500648 6 | * QQ交流群:286081824 7 | ***************************************/ 8 | public class CreateThread { 9 | public static void main(String[] args) { 10 | Thread t1 = new Thread(); 11 | Thread t2 = new Thread() { 12 | @Override 13 | public void run() { 14 | System.out.println("=========="); 15 | } 16 | }; 17 | t1.start(); 18 | t2.start(); 19 | System.out.println(t1.getName()); 20 | System.out.println(t2.getName()); 21 | 22 | Thread t3 = new Thread("MyName"); 23 | Thread t4 = new Thread(() -> { 24 | System.out.println("Runnable..."); 25 | }); 26 | 27 | System.out.println(t3.getName()); 28 | System.out.println(t4.getName()); 29 | 30 | Thread t5 = new Thread(() -> { 31 | System.out.println("Runnable..." + Thread.currentThread().getName()); 32 | }, "RunnableThread"); 33 | 34 | t5.start(); 35 | } 36 | } 37 | --------------------------------------------------------------------------------