├── .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 |
5 |
6 |
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 extends Message> 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 extends E> messageType,
6 | Channel extends E> 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 extends Message> 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 |
13 |
14 |
15 |
16 |
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 extends Message> messageType,
27 | Channel extends Message> 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 |
--------------------------------------------------------------------------------