├── .gitignore ├── README.md ├── blogs ├── README.md ├── javase │ ├── java基础巩固笔记(1)-反射.md │ ├── java基础巩固笔记(2)-泛型.md │ ├── java基础巩固笔记(3)-类加载器.md │ ├── java基础巩固笔记(4)-代理.md │ ├── java基础巩固笔记(4)-实现AOP功能的封装与配置的小框架.md │ ├── java基础巩固笔记(5)-多线程之传统多线程.md │ ├── java基础巩固笔记(5)-多线程之共享数据.md │ ├── java基础巩固笔记(5)-多线程之线程并发库.md │ └── java基础巩固笔记(6)-注解.md └── javaweb │ ├── javaweb入门笔记(1)-Tomcat.md │ ├── javaweb入门笔记(2)-http入门.md │ ├── javaweb入门笔记(3)-Servlet.md │ ├── javaweb入门笔记(4)-request和response.md │ ├── javaweb入门笔记(5)-cookie和session.md │ └── javaweb入门笔记(6)-JSP技术.md ├── java-base ├── pom.xml └── src │ └── main │ └── java │ └── com │ └── brianway │ └── learning │ └── java │ └── base │ ├── Binary.java │ ├── HelloWorld.java │ ├── constructor │ ├── datatype │ ├── Boxing.java │ ├── IntegerChanger.java │ └── NumberEquation.java │ ├── generics │ ├── ArrayMaker.java │ ├── BasicBounds.java │ ├── ClassTypeCapture.java │ ├── CovariantArrays.java │ ├── CreatorGeneric.java │ ├── ErasedTypeEquivalence.java │ ├── FactoryConstraint.java │ ├── GenericArray.java │ ├── GenericArray2.java │ ├── GenericArrayWithTypeToken.java │ ├── GenericMethods.java │ ├── GenericReading.java │ ├── GenericVarargs.java │ ├── GenericWriting.java │ ├── GenericsAndCovariance.java │ ├── Holder.java │ ├── InheritBounds.java │ ├── InstantiateGenericType.java │ ├── LinkedStack.java │ ├── LostInformation.java │ ├── SuperTypeWildcards.java │ └── Wildcards.java │ ├── innerclass │ ├── ClassCreator.java │ └── EnclosingOne.java │ └── typeinfo │ ├── BoundedClassReferences.java │ ├── ClassCasts.java │ ├── ClassInitialization.java │ ├── FamilyVsExactType.java │ ├── FilledList.java │ ├── GenericClassReferences.java │ ├── SimpleDynamicProxy.java │ ├── SimpleProxyDemo.java │ └── WildcardClassReferences.java ├── java-container └── pom.xml ├── java-io ├── pom.xml └── src │ └── main │ ├── java │ └── com │ │ └── brianway │ │ └── learning │ │ └── java │ │ ├── io │ │ ├── BufferedInputFile.java │ │ ├── DirList.java │ │ ├── Echo.java │ │ ├── FileOutput.java │ │ ├── MakeDirectories.java │ │ ├── MemoryInput.java │ │ └── TextFile.java │ │ └── nio │ │ ├── BufferToText.java │ │ ├── ChannelCopy.java │ │ ├── Endians.java │ │ ├── GetChannel.java │ │ └── ViewBuffers.java │ └── resources │ └── infile.txt ├── java-jvm ├── pom.xml └── src │ └── main │ └── java │ └── com │ └── brianway │ └── learning │ └── java │ └── jvm │ ├── classloading │ ├── ClassLoaderTest.java │ ├── ClinitOrder.java │ ├── ConstClass.java │ ├── DeadLoopClass.java │ ├── FieldResolution.java │ ├── NoInitialization.java │ ├── SimpleClass.java │ ├── SubClass.java │ └── SuperClass.java │ ├── dynamictype │ ├── GrandFatherCaller.java │ ├── InvokeDynamicTest.java │ └── MethodHandleTest.java │ ├── gc │ ├── FinalizeEscapeGC.java │ └── ReferenceCountingGC.java │ ├── memory │ ├── DirectMemoryOOM.java │ ├── HeapOOM.java │ ├── JavaVMStackOOM.java │ ├── JavaVMStackSOF.java │ └── RuntimeConstantPoolOOM.java │ └── methodinvoke │ ├── Dispatch.java │ ├── DynamicDispatch.java │ ├── StaticDispatch.java │ └── StaticResolution.java ├── java-multithread ├── README.md ├── pom.xml └── src │ └── main │ └── java │ └── com │ └── brianway │ └── learning │ └── java │ ├── concurrent │ ├── CachedThreadPool.java │ ├── CallableDemo.java │ ├── CaptureUncaughtException.java │ ├── CloseResource.java │ ├── CountDownLatchDemo.java │ ├── DaemonFromFactory.java │ ├── DaemonThreadFactory.java │ ├── DaemonsDontRunFinally.java │ ├── FixedThreadPool.java │ ├── Interrupting.java │ ├── InterruptingIdiom.java │ ├── Joining.java │ ├── LiftOff.java │ ├── MoreBasicThreads.java │ ├── OrnamentalGarden.java │ ├── PipedIO.java │ ├── SimpleDaemons.java │ ├── SingleThreadExecutor.java │ ├── SleepingTask.java │ ├── TestBlockingQueues.java │ └── ToastOMatic.java │ └── multithread │ ├── communication │ ├── example1 │ │ ├── MyList.java │ │ ├── Run1_TwoThreadTransData.java │ │ ├── ThreadA.java │ │ └── ThreadB.java │ ├── example10 │ │ ├── C_Thread.java │ │ ├── Consumer.java │ │ ├── MyStack.java │ │ ├── P_Thread.java │ │ ├── Producer.java │ │ └── Run10_oneP_manyC.java │ ├── example11 │ │ ├── C_Thread.java │ │ ├── Consumer.java │ │ ├── MyStack.java │ │ ├── P_Thread.java │ │ ├── Producer.java │ │ ├── Run11_manyP_manyC.java │ │ ├── Run11_manyP_oneC.java │ │ └── Run11_oneP_manyC.java │ ├── example12 │ │ ├── ReadData.java │ │ ├── Run12_pipeInputOutput.java │ │ ├── ThreadRead.java │ │ ├── ThreadWrite.java │ │ └── WriteData.java │ ├── example13 │ │ ├── BackupA.java │ │ ├── BackupB.java │ │ ├── DBTools.java │ │ └── Run13_wait_notify_insert.java │ ├── example14 │ │ ├── Run14_join.java │ │ ├── Run14_joinExption.java │ │ ├── Run14_joinLong.java │ │ ├── ThreadA.java │ │ ├── ThreadB.java │ │ └── ThreadC.java │ ├── example15 │ │ ├── Run15_joinMore.java │ │ ├── Run15_join_sleep.java │ │ ├── Run15_join_sleep_2.java │ │ ├── ThreadA.java │ │ ├── ThreadB.java │ │ └── ThreadC.java │ ├── example16 │ │ ├── InheritableThreadLocalExt.java │ │ ├── InheritableThreadLocalExt2.java │ │ ├── Run16_InheritableThreadLocalExt.java │ │ ├── Run16_InheritableThreadLocalExt2.java │ │ ├── Run16_ThreadLocal.java │ │ ├── ThreadA.java │ │ ├── ThreadB.java │ │ ├── ThreadC.java │ │ ├── ThreadLocalExt.java │ │ └── Tools.java │ ├── example2 │ │ ├── Run2_noObjectLock.java │ │ ├── Run2_notify.java │ │ ├── Run2_sleep.java │ │ ├── Run2_wait.java │ │ ├── Thread1.java │ │ └── Thread2.java │ ├── example3 │ │ ├── MyThread.java │ │ ├── NotifyThread.java │ │ ├── NotifyThread2.java │ │ ├── NotifyThread3.java │ │ ├── Run3_notifyAll.java │ │ ├── Run3_notifyMany.java │ │ ├── Run3_notifyOne.java │ │ └── Service.java │ ├── example4 │ │ ├── Run4_waitHasParam.java │ │ └── Run4_waitHasParam2.java │ ├── example5 │ │ ├── MyRun.java │ │ ├── Run5_notify.java │ │ └── Run5_notifyEarly.java │ ├── example6 │ │ ├── Add.java │ │ ├── Run6_waitOld.java │ │ ├── Subtract.java │ │ ├── ThreadAdd.java │ │ ├── ThreadSubtract.java │ │ └── ValueObject.java │ ├── example7 │ │ ├── Consumer.java │ │ ├── Run7_ProducerAndConsumer_One.java │ │ ├── ThreadC.java │ │ ├── ThreadP.java │ │ ├── ValueObject.java │ │ └── producer.java │ ├── example8 │ │ ├── Consumer.java │ │ ├── Producer.java │ │ ├── Run8_allWait.java │ │ ├── ThreadC.java │ │ ├── ThreadP.java │ │ └── ValueObject.java │ └── example9 │ │ ├── C_Thread.java │ │ ├── Consumer.java │ │ ├── MyStack.java │ │ ├── P_Thread.java │ │ ├── Producer.java │ │ ├── Run9_oneP_manyC.java │ │ └── Run9_oneP_oneC.java │ ├── lock │ ├── example1 │ │ ├── Run1_UseConditionWaitNotify.java │ │ ├── Run1_UseConditionWaitNotifyError.java │ │ ├── Run1_UseConditionWaitNotifyOk.java │ │ ├── ServiceA.java │ │ ├── ServiceB.java │ │ ├── ServiceC.java │ │ ├── ThreadA.java │ │ ├── ThreadB.java │ │ └── ThreadC.java │ ├── example10 │ │ ├── Run10_ReadWriteLockBegin1.java │ │ ├── Run10_ReadWriteLockBegin2.java │ │ ├── Run10_ReadWriteLockBegin3.java │ │ ├── Run10_condition.java │ │ ├── Service1.java │ │ ├── Service2.java │ │ └── Service3.java │ ├── example2 │ │ ├── MyService.java │ │ ├── Run2_MustUseMoreCondition.java │ │ ├── ThreadA.java │ │ └── ThreadB.java │ ├── example3 │ │ ├── MyService.java │ │ ├── Run3_ConditionManyToMany.java │ │ ├── ThreadA.java │ │ └── ThreadB.java │ ├── example4 │ │ ├── Run4_Fair.java │ │ ├── Run4_notFair.java │ │ └── Service.java │ ├── example5 │ │ ├── Run5_getHoldCount.java │ │ ├── Run5_getQueueLength.java │ │ ├── Run5_getWaitQueueLength.java │ │ ├── Service1.java │ │ ├── Service2.java │ │ └── Service3.java │ ├── example6 │ │ ├── Run6_hasQueueThread.java │ │ ├── Run6_hasWaiters.java │ │ ├── Service1.java │ │ └── Service2.java │ ├── example7 │ │ ├── Run7_isFair.java │ │ ├── Run7_isHeldByCurrentThread.java │ │ ├── Run7_isLocked.java │ │ ├── Service1.java │ │ ├── Service2.java │ │ └── Service3.java │ ├── example8 │ │ ├── Run8_lockInterruptibly1.java │ │ ├── Run8_lockInterruptibly2.java │ │ ├── Run8_tryLock.java │ │ ├── Run8_tryLock_param.java │ │ ├── Service1.java │ │ ├── Service2.java │ │ ├── Service3.java │ │ └── Service4.java │ └── example9 │ │ ├── Run9_awaitUniterruptibly1.java │ │ ├── Run9_awaitUniterruptibly2.java │ │ ├── Run9_awaitUntil1.java │ │ ├── Run9_awaitUntil2.java │ │ ├── Service.java │ │ ├── Service1.java │ │ ├── Service2.java │ │ ├── Thread1.java │ │ ├── Thread2.java │ │ ├── ThreadA.java │ │ └── ThreadB.java │ ├── meet │ ├── Run.java │ ├── Run10_isInterrupted.java │ ├── Run11_sleepAndinterrupt01.java │ ├── Run12_sleepAndinterrupt02.java │ ├── Run13_suspendAndresume01.java │ ├── Run14_suspendAndresume02.java │ ├── Run15_suspendAndresume03.java │ ├── Run16_yield.java │ ├── Run17_priority01.java │ ├── Run18_priority02.java │ ├── Run2_StartVsRun.java │ ├── Run3_getName.java │ ├── Run4_isAlive01.java │ ├── Run5_isAlive02.java │ ├── Run6_StartVsRun02.java │ ├── Run7_interrupt01.java │ ├── Run8_interrupted01.java │ ├── Run9_interrupted02.java │ └── printMain.java │ ├── singleton │ ├── example1 │ │ ├── MyObject0.java │ │ ├── MyObject1.java │ │ ├── MyObject2.java │ │ ├── Run1_singleton0.java │ │ ├── Run1_singleton1.java │ │ ├── Run1_singleton2.java │ │ ├── Thread0.java │ │ ├── Thread1.java │ │ └── Thread2.java │ ├── example2 │ │ ├── MyObject1.java │ │ ├── MyObject2.java │ │ ├── MyObject3.java │ │ ├── MyObject4.java │ │ ├── Run2_singleton1.java │ │ ├── Run2_singleton2.java │ │ ├── Run2_singleton3.java │ │ ├── Run2_singleton4.java │ │ ├── Thread1.java │ │ ├── Thread2.java │ │ ├── Thread3.java │ │ └── Thread4.java │ └── example3 │ │ ├── MyObject1.java │ │ ├── MyObject2.java │ │ ├── MyObject3.java │ │ ├── MyObject4.java │ │ ├── MyObject5.java │ │ ├── Run3_singleton1.java │ │ ├── Run3_singleton2.java │ │ ├── Run3_singleton3.java │ │ ├── Run3_singleton4.java │ │ ├── Run3_singleton5.java │ │ ├── Thread1.java │ │ ├── Thread3.java │ │ ├── Thread4.java │ │ └── Thread5.java │ ├── supplement │ ├── example1 │ │ ├── MyService.java │ │ ├── Run1_state1.java │ │ ├── Run1_state2.java │ │ ├── Run1_state3.java │ │ ├── Thread1.java │ │ ├── Thread2.java │ │ └── Thread3.java │ ├── example2 │ │ ├── MyThread.java │ │ ├── Run2_autoAddGroup.java │ │ ├── Run2_getGroupParent.java │ │ ├── Run2_groupAddThread.java │ │ ├── Run2_groupAddThreadMoreLevel.java │ │ ├── Run2_threadRunSyn.java │ │ ├── ThreadA.java │ │ └── ThreadB.java │ ├── example3 │ │ ├── DateTools1.java │ │ ├── DateTools2.java │ │ ├── Run3_formatError.java │ │ ├── Run3_formatOK1.java │ │ ├── Run3_formatOK2.java │ │ ├── Thread0.java │ │ ├── Thread1.java │ │ └── Thread2.java │ ├── example4 │ │ ├── Run4_threadCreateException.java │ │ ├── Run4_threadCreateException2.java │ │ ├── Run4_threadCreateException3.java │ │ └── Thread1.java │ ├── example5 │ │ ├── Run5_threadGroup1.java │ │ ├── Run5_threadGroup2.java │ │ ├── Thread1.java │ │ ├── Thread2.java │ │ └── ThreadGroup2.java │ └── example6 │ │ ├── MyThread.java │ │ ├── MyThreadGroup.java │ │ ├── ObjectUncaughtExceptionHandler.java │ │ ├── Run6_threadExceptionMove1.java │ │ ├── Run6_threadExceptionMove2.java │ │ └── StateUncaughtExceptionHandler.java │ ├── synchronize │ ├── example1 │ │ ├── HasLocalNum.java │ │ ├── Run1_local.java │ │ ├── ThreadA.java │ │ └── ThreadB.java │ ├── example10 │ │ ├── Run10_synBlockMoreObjectOneLock.java │ │ ├── Run10_synMoreObjectStaticOneLock.java │ │ ├── Run10_synTwoLock.java │ │ ├── Service.java │ │ ├── ServiceSub.java │ │ ├── ServiceSub2.java │ │ ├── ThreadA.java │ │ ├── ThreadB.java │ │ └── ThreadC.java │ ├── example11 │ │ ├── Run11_StringAndSyn.java │ │ ├── Run11_StringAndSyn2.java │ │ ├── ServiceA.java │ │ ├── ServiceB.java │ │ ├── ThreadA.java │ │ └── ThreadB.java │ ├── example12 │ │ ├── DealThread.java │ │ └── Run12_deadLock.java │ ├── example13 │ │ ├── OutClass.java │ │ ├── OutClass2.java │ │ ├── Run13_inner01.java │ │ └── Run13_inner02.java │ ├── example14 │ │ ├── Run14_setNewStringTwoLock.java │ │ └── Service.java │ ├── example15 │ │ ├── Run15_synchronized.java │ │ ├── Run15_volatile.java │ │ ├── RunThread.java │ │ └── RunThread2.java │ ├── example16 │ │ ├── MyThread.java │ │ └── Run16_volatile.java │ ├── example2 │ │ ├── HasSelfPrivateNum.java │ │ ├── Run2_private01.java │ │ ├── Run2_twoObject.java │ │ ├── ThreadA.java │ │ └── ThreadB.java │ ├── example3 │ │ ├── MyObject.java │ │ ├── Run3_synchronized01.java │ │ ├── ThreadA.java │ │ └── ThreadB.java │ ├── example4 │ │ ├── MyObject.java │ │ ├── Run4_synchronized01.java │ │ ├── ThreadA.java │ │ └── ThreadB.java │ ├── example5 │ │ ├── Main.java │ │ ├── Run5_lockRein.java │ │ └── Sub.java │ ├── example6 │ │ ├── Run6_exception.java │ │ ├── Service.java │ │ ├── ThreadA.java │ │ └── ThreadB.java │ ├── example7 │ │ ├── Main.java │ │ ├── MyThread.java │ │ ├── Run7_synNotExtends.java │ │ └── Sub.java │ ├── example8 │ │ ├── CommonUtils.java │ │ ├── MyThreadA.java │ │ ├── MyThreadB.java │ │ ├── Run8_synchronized01.java │ │ ├── Run8_synchronized02.java │ │ ├── TaskA.java │ │ └── TaskB.java │ └── example9 │ │ ├── MyObject.java │ │ ├── MyObject1.java │ │ ├── MyObject2.java │ │ ├── MyThread.java │ │ ├── Run9_synchronized01.java │ │ ├── Run9_synchronized01_twoObjects.java │ │ ├── Run9_synchronized02.java │ │ ├── Run9_synchronized03.java │ │ ├── Service.java │ │ ├── Thread1.java │ │ └── Thread2.java │ └── timer │ ├── example1 │ ├── MyTask.java │ ├── Run1_timer1.java │ ├── Run1_timer2.java │ ├── Run1_timer3.java │ ├── Run1_timer4.java │ ├── Run1_timer5.java │ ├── TaskA.java │ └── TaskB.java │ ├── example2 │ ├── MyTask.java │ ├── Run2_period1.java │ ├── Run2_period2.java │ ├── Run2_period3.java │ └── TaskA.java │ ├── example3 │ ├── MyTask.java │ ├── Run3_cancel1.java │ ├── Run3_cancel2.java │ ├── Run3_cancel3.java │ ├── TaskA.java │ ├── TaskA2.java │ ├── TaskB.java │ └── TaskB2.java │ └── example4 │ ├── Run4_schedule1.java │ ├── Run4_schedule2.java │ ├── Run4_schedule3.java │ ├── Run4_schedule4.java │ ├── Run4_schedule5.java │ ├── Run4_schedule6.java │ ├── Run4_scheduleAtFixedRate1.java │ ├── Run4_scheduleAtFixedRate2.java │ ├── Run4_scheduleAtFixedRate3.java │ ├── Run4_scheduleAtFixedRate4.java │ ├── Run4_schedule_vs_scheduleAtFixedRate_1.java │ └── Run4_schedule_vs_scheduleAtFixedRate_2.java ├── java8 ├── README.md ├── pom.xml └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── brianway │ │ │ └── learning │ │ │ └── java8 │ │ │ ├── effective │ │ │ ├── Ambiguous.java │ │ │ ├── async │ │ │ │ ├── AsyncShop.java │ │ │ │ ├── AsyncShopClient.java │ │ │ │ ├── BestPriceFinder.java │ │ │ │ ├── BestPriceFinderMain.java │ │ │ │ ├── Discount.java │ │ │ │ ├── ExchangeService.java │ │ │ │ ├── Quote.java │ │ │ │ ├── Shop.java │ │ │ │ ├── Util.java │ │ │ │ └── v1 │ │ │ │ │ ├── BestPriceFinder.java │ │ │ │ │ ├── BestPriceFinderMain.java │ │ │ │ │ ├── Shop.java │ │ │ │ │ └── ShopMain.java │ │ │ ├── optional │ │ │ │ ├── Car.java │ │ │ │ ├── Insurance.java │ │ │ │ ├── OptionalInAction.java │ │ │ │ ├── OptionalMain.java │ │ │ │ ├── Person.java │ │ │ │ └── ReadPositiveIntParam.java │ │ │ ├── tech │ │ │ │ ├── ChainOfResponsibilityMain.java │ │ │ │ ├── Debugging.java │ │ │ │ ├── FactoryMain.java │ │ │ │ ├── ObserverMain.java │ │ │ │ ├── Peek.java │ │ │ │ ├── StrategyMain.java │ │ │ │ └── TemplateMain.java │ │ │ └── time │ │ │ │ └── DateTimeExamples.java │ │ │ ├── lambda │ │ │ ├── ConstructorReference.java │ │ │ ├── ExecuteAround.java │ │ │ ├── FilteringApples.java │ │ │ └── FunctionDescriptor.java │ │ │ └── streamapi │ │ │ ├── BuildingStreams.java │ │ │ ├── Dish.java │ │ │ ├── Laziness.java │ │ │ ├── StreamBasic.java │ │ │ ├── StreamOperation.java │ │ │ ├── collect │ │ │ ├── CollectorHarness.java │ │ │ ├── Grouping.java │ │ │ ├── GroupingTransactions.java │ │ │ ├── PartitionPrimeNumbers.java │ │ │ ├── Partitioning.java │ │ │ ├── Reducing.java │ │ │ ├── Summarizing.java │ │ │ └── ToListCollector.java │ │ │ ├── parallel │ │ │ ├── ForkJoinSumCalculator.java │ │ │ ├── ParallelStreams.java │ │ │ ├── ParallelStreamsHarness.java │ │ │ └── WordCount.java │ │ │ ├── practice │ │ │ ├── PuttingIntoPractice.java │ │ │ ├── Trader.java │ │ │ └── Transaction.java │ │ │ └── usage │ │ │ ├── Filtering.java │ │ │ ├── Finding.java │ │ │ ├── Mapping.java │ │ │ ├── NumericStreams.java │ │ │ └── Reducing.java │ └── resources │ │ ├── data-building.txt │ │ └── data-lambda.txt │ └── test │ └── java │ └── com │ └── brianway │ └── learning │ └── java8 │ └── effective │ └── optional │ └── ReadPositiveIntParamTest.java └── pom.xml /.gitignore: -------------------------------------------------------------------------------- 1 | # Eclipse 2 | .classpath 3 | .project 4 | .settings/ 5 | 6 | # Intellij 7 | .idea/ 8 | *.iml 9 | *.iws 10 | 11 | # Mac 12 | .DS_Store 13 | 14 | # Maven 15 | log/ 16 | target/ 17 | out/ 18 | 19 | # Others 20 | bin/ 21 | .myeclipse 22 | .hprof -------------------------------------------------------------------------------- /java-base/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | java-learning 7 | com.brianway.learning.java 8 | 1.0-SNAPSHOT 9 | 10 | 4.0.0 11 | 12 | java-base 13 | 14 | -------------------------------------------------------------------------------- /java-base/src/main/java/com/brianway/learning/java/base/HelloWorld.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.base; 2 | 3 | /** 4 | * Created by Brian on 2016/4/13. 5 | */ 6 | public class HelloWorld { 7 | public static void main(String[] args) { 8 | System.out.println("Hello World"); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /java-base/src/main/java/com/brianway/learning/java/base/constructor/FatherClass.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.base.constructor; 2 | 3 | /** 4 | * Created by Brian on 2016/4/14. 5 | */ 6 | public class FatherClass { 7 | protected static int count = 10; 8 | private String name; 9 | 10 | static { 11 | System.out.println("父类的静态属性count初始化:" + count); 12 | } 13 | 14 | public FatherClass() { 15 | System.out.println("执行了父类的无参构造方法"); 16 | } 17 | 18 | public FatherClass(String name) { 19 | this.name = name; 20 | System.out.println("执行了父类的构造方法FatherClass(String name) " + name); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /java-base/src/main/java/com/brianway/learning/java/base/datatype/NumberEquation.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.base.datatype; 2 | 3 | /** 4 | * Created by brian on 16/11/10. 5 | * 6 | * 包装类的“==”运算在不遇到算术运算的情况下不会自动拆箱; 7 | * 包装类的equals()方法不处理数据转型. 8 | */ 9 | public class NumberEquation { 10 | public static void main(String[] args) { 11 | Integer i = 42; 12 | Long l = 42l; 13 | Double d = 42.0; 14 | 15 | System.out.println(i.equals(d)); // false 16 | System.out.println(d.equals(l)); // false 17 | System.out.println(i.equals(l)); // false 18 | System.out.println(l.equals(42L)); // true 19 | } 20 | } 21 | 22 | // (i == l),(i == d),(l == d)会出现编译错误 -------------------------------------------------------------------------------- /java-base/src/main/java/com/brianway/learning/java/base/generics/ArrayMaker.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.base.generics; 2 | 3 | import java.lang.reflect.Array; 4 | import java.util.Arrays; 5 | 6 | /** 7 | * 对于泛型中创建数组,使用Array.newInstance()是推荐的方式 8 | */ 9 | public class ArrayMaker { 10 | private Class kind; 11 | 12 | public ArrayMaker(Class kind) { 13 | this.kind = kind; 14 | } 15 | 16 | @SuppressWarnings("unchecked") 17 | T[] create(int size) { 18 | return (T[]) Array.newInstance(kind, size); 19 | } 20 | 21 | public static void main(String[] args) { 22 | ArrayMaker stringMaker = 23 | new ArrayMaker(String.class); 24 | String[] stringArray = stringMaker.create(9); 25 | System.out.println(Arrays.toString(stringArray)); 26 | } 27 | } 28 | /* Output: 29 | [null, null, null, null, null, null, null, null, null] 30 | *///:~ 31 | -------------------------------------------------------------------------------- /java-base/src/main/java/com/brianway/learning/java/base/generics/CreatorGeneric.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.base.generics; 2 | 3 | /** 4 | * 末班方法设计模式 5 | */ 6 | public class CreatorGeneric { 7 | public static void main(String[] args) { 8 | Creator c = new Creator(); 9 | c.f(); 10 | } 11 | } 12 | 13 | abstract class GenericWithCreate { 14 | final T element; 15 | 16 | GenericWithCreate() { 17 | element = create(); 18 | } 19 | 20 | abstract T create(); 21 | } 22 | 23 | class X { 24 | } 25 | 26 | class Creator extends GenericWithCreate { 27 | X create() { 28 | return new X(); 29 | } 30 | 31 | void f() { 32 | System.out.println(element.getClass().getSimpleName()); 33 | } 34 | } 35 | 36 | /* Output: 37 | X 38 | *///:~ 39 | -------------------------------------------------------------------------------- /java-base/src/main/java/com/brianway/learning/java/base/generics/ErasedTypeEquivalence.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.base.generics; 2 | 3 | import java.util.ArrayList; 4 | 5 | public class ErasedTypeEquivalence { 6 | public static void main(String[] args) { 7 | Class c1 = new ArrayList().getClass(); 8 | Class c2 = new ArrayList().getClass(); 9 | Class c3 = ArrayList.class; 10 | System.out.println(c1 == c2); 11 | System.out.println(c1 == c3); 12 | } 13 | } 14 | /* Output: 15 | true 16 | true 17 | *///:~ 18 | -------------------------------------------------------------------------------- /java-base/src/main/java/com/brianway/learning/java/base/generics/FactoryConstraint.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.base.generics;//: generics/FactoryConstraint.java 2 | 3 | /** 4 | * 显式工厂 5 | */ 6 | public class FactoryConstraint { 7 | public static void main(String[] args) { 8 | new Foo2(new IntegerFactory()); 9 | new Foo2(new Widget.Factory()); 10 | } 11 | } 12 | 13 | interface FactoryI { 14 | T create(); 15 | } 16 | 17 | class Foo2 { 18 | private T x; 19 | 20 | public > Foo2(F factory) { 21 | x = factory.create(); 22 | } 23 | 24 | } 25 | 26 | class IntegerFactory implements FactoryI { 27 | public Integer create() { 28 | return 0; 29 | } 30 | } 31 | 32 | class Widget { 33 | public static class Factory implements FactoryI { 34 | public Widget create() { 35 | return new Widget(); 36 | } 37 | } 38 | } 39 | ///:~ 40 | -------------------------------------------------------------------------------- /java-base/src/main/java/com/brianway/learning/java/base/generics/GenericArray.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.base.generics;//: generics/GenericArray.java 2 | 3 | /** 4 | * 泛型数组 5 | */ 6 | public class GenericArray { 7 | private T[] array; 8 | 9 | @SuppressWarnings("unchecked") 10 | public GenericArray(int sz) { 11 | array = (T[]) new Object[sz]; 12 | } 13 | 14 | public void put(int index, T item) { 15 | array[index] = item; 16 | } 17 | 18 | public T get(int index) { 19 | return array[index]; 20 | } 21 | 22 | // Method that exposes the underlying representation: 23 | public T[] rep() { 24 | return array; 25 | } 26 | 27 | public static void main(String[] args) { 28 | GenericArray gai = 29 | new GenericArray(10); 30 | // This causes a ClassCastException: 31 | //! Integer[] ia = gai.rep(); 32 | // This is OK: 33 | Object[] oa = gai.rep(); 34 | } 35 | } ///:~ 36 | -------------------------------------------------------------------------------- /java-base/src/main/java/com/brianway/learning/java/base/generics/GenericMethods.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.base.generics; 2 | 3 | /** 4 | * 泛型方法 5 | */ 6 | public class GenericMethods { 7 | public void f(T x) { 8 | System.out.println(x.getClass().getName()); 9 | } 10 | 11 | public static void main(String[] args) { 12 | GenericMethods gm = new GenericMethods(); 13 | gm.f(""); 14 | gm.f(1); 15 | gm.f(1.0); 16 | gm.f(1.0F); 17 | gm.f('c'); 18 | gm.f(gm); 19 | } 20 | } 21 | /* Output: 22 | java.lang.String 23 | java.lang.Integer 24 | java.lang.Double 25 | java.lang.Float 26 | java.lang.Character 27 | GenericMethods 28 | *///:~ 29 | -------------------------------------------------------------------------------- /java-base/src/main/java/com/brianway/learning/java/base/generics/GenericVarargs.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.base.generics; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | /** 7 | * 可变参数与泛型方法 8 | */ 9 | public class GenericVarargs { 10 | public static List makeList(T... args) { 11 | List result = new ArrayList(); 12 | for (T item : args) 13 | result.add(item); 14 | return result; 15 | } 16 | 17 | public static void main(String[] args) { 18 | List ls = makeList("A"); 19 | System.out.println(ls); 20 | ls = makeList("A", "B", "C"); 21 | System.out.println(ls); 22 | ls = makeList("ABCDEFFHIJKLMNOPQRSTUVWXYZ".split("")); 23 | System.out.println(ls); 24 | } 25 | } 26 | /* Output: 27 | [A] 28 | [A, B, C] 29 | [, A, B, C, D, E, F, F, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z] 30 | *///:~ 31 | -------------------------------------------------------------------------------- /java-base/src/main/java/com/brianway/learning/java/base/generics/GenericsAndCovariance.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.base.generics; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | /** 7 | * 8 | */ 9 | public class GenericsAndCovariance { 10 | public static void main(String[] args) { 11 | // Wildcards allow covariance: 12 | List flist = new ArrayList(); 13 | // Compile Error: can't add any type of object: 14 | // flist.add(new Apple()); 15 | // flist.add(new Fruit()); 16 | // flist.add(new Object()); 17 | flist.add(null); // Legal but uninteresting 18 | // We know that it returns at least Fruit: 19 | Fruit f = flist.get(0); 20 | } 21 | } ///:~ 22 | -------------------------------------------------------------------------------- /java-base/src/main/java/com/brianway/learning/java/base/generics/SuperTypeWildcards.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.base.generics; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | /** 7 | * 逆变 8 | * 超类型通配符 9 | */ 10 | public class SuperTypeWildcards { 11 | static void writeTo(List apples) { 12 | apples.add(new Apple()); 13 | apples.add(new Jonathan()); 14 | // apples.add(new Fruit()); // Error 15 | } 16 | 17 | public static void main(String[] args) { 18 | SuperTypeWildcards.writeTo(new ArrayList()); 19 | } 20 | } ///:~ 21 | -------------------------------------------------------------------------------- /java-base/src/main/java/com/brianway/learning/java/base/innerclass/ClassCreator.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.base.innerclass; 2 | 3 | /** 4 | * Created by brian on 16/11/10. 5 | * 6 | * 创建内部类的测试类 7 | */ 8 | public class ClassCreator { 9 | public static void main(String[] args) { 10 | //在其他类里创建非静态内部类和静态内部类 11 | EnclosingOne eo = new EnclosingOne(); 12 | EnclosingOne.InsideOne io = eo.new InsideOne(); 13 | EnclosingOne.InsideTwo it = new EnclosingOne.InsideTwo(); 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /java-base/src/main/java/com/brianway/learning/java/base/innerclass/EnclosingOne.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.base.innerclass; 2 | 3 | /** 4 | * Created by brian on 16/11/10. 5 | */ 6 | public class EnclosingOne { 7 | 8 | public class InsideOne { 9 | 10 | } 11 | 12 | static public class InsideTwo { 13 | 14 | } 15 | 16 | public static void main(String[] args) { 17 | EnclosingOne eo = new EnclosingOne(); 18 | InsideOne io = eo.new InsideOne(); 19 | InsideTwo it = new InsideTwo(); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /java-base/src/main/java/com/brianway/learning/java/base/typeinfo/BoundedClassReferences.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.base.typeinfo; 2 | 3 | public class BoundedClassReferences { 4 | public static void main(String[] args) { 5 | Class bounded = int.class; 6 | bounded = double.class; 7 | bounded = Number.class; 8 | // Or anything else derived from Number. 9 | } 10 | } ///:~ 11 | -------------------------------------------------------------------------------- /java-base/src/main/java/com/brianway/learning/java/base/typeinfo/GenericClassReferences.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.base.typeinfo; 2 | 3 | public class GenericClassReferences { 4 | public static void main(String[] args) { 5 | 6 | Class genericIntClass = int.class; 7 | genericIntClass = Integer.class; // Same thing 8 | 9 | Class intClass = int.class; 10 | intClass = double.class; 11 | // genericIntClass = double.class; // Illegal 12 | 13 | System.out.println(int.class == Integer.class); 14 | } 15 | } ///:~ 16 | -------------------------------------------------------------------------------- /java-base/src/main/java/com/brianway/learning/java/base/typeinfo/WildcardClassReferences.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.base.typeinfo; 2 | 3 | public class WildcardClassReferences { 4 | public static void main(String[] args) { 5 | Class intClass = int.class; 6 | intClass = double.class; 7 | } 8 | } ///:~ 9 | -------------------------------------------------------------------------------- /java-container/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | java-learning 7 | com.brianway.learning.java 8 | 1.0-SNAPSHOT 9 | 10 | 4.0.0 11 | 12 | java-container 13 | 14 | -------------------------------------------------------------------------------- /java-io/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | java-learning 7 | com.brianway.learning.java 8 | 1.0-SNAPSHOT 9 | 10 | 4.0.0 11 | 12 | java-io 13 | 14 | -------------------------------------------------------------------------------- /java-io/src/main/java/com/brianway/learning/java/io/BufferedInputFile.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.io; 2 | 3 | import java.io.BufferedReader; 4 | import java.io.FileReader; 5 | import java.io.IOException; 6 | 7 | /** 8 | * Created by brian on 16/11/28. 9 | */ 10 | public class BufferedInputFile { 11 | public static String read(String filename) throws IOException { 12 | BufferedReader in = new BufferedReader( 13 | new FileReader(filename)); 14 | String s; 15 | StringBuilder sb = new StringBuilder(); 16 | while ((s = in.readLine()) != null) { 17 | sb.append(s).append("\n"); 18 | } 19 | in.close(); 20 | return sb.toString(); 21 | } 22 | 23 | public static void main(String[] args) throws IOException { 24 | String file = BufferedInputFile.class.getResource("/").getPath() 25 | + "/infile.txt"; 26 | System.out.print(read(file)); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /java-io/src/main/java/com/brianway/learning/java/io/Echo.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.io; 2 | 3 | import java.io.BufferedReader; 4 | import java.io.IOException; 5 | import java.io.InputStreamReader; 6 | import java.io.PrintWriter; 7 | 8 | /** 9 | * Created by brian on 16/11/28. 10 | * 11 | * 从标准输入中读取,并将 System.out 转换成 PrintWriter 12 | */ 13 | public class Echo { 14 | public static void main(String[] args) throws IOException { 15 | BufferedReader stdin = new BufferedReader( 16 | new InputStreamReader(System.in)); 17 | PrintWriter out = new PrintWriter(System.out, true);// 开启自动清空 18 | 19 | String s; 20 | while ((s = stdin.readLine()) != null && s.length() != 0) { 21 | //System.out.println(s); 22 | out.println(s); 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /java-io/src/main/resources/infile.txt: -------------------------------------------------------------------------------- 1 | ----------------------------------------- 2 | public static String read(String filename) throws IOException { 3 | BufferedReader in = new BufferedReader( 4 | new FileReader(filename)); 5 | String s; 6 | StringBuilder sb = new StringBuilder(); 7 | while ((s = in.readLine()) != null) { 8 | sb.append(s).append("\n"); 9 | } 10 | in.close(); 11 | return sb.toString(); 12 | } -------------------------------------------------------------------------------- /java-jvm/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | java-learning 7 | com.brianway.learning.java 8 | 1.0-SNAPSHOT 9 | 10 | 4.0.0 11 | 12 | java-jvm 13 | 14 | -------------------------------------------------------------------------------- /java-jvm/src/main/java/com/brianway/learning/java/jvm/classloading/ClinitOrder.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.jvm.classloading; 2 | 3 | /** 4 | * Created by brian on 17/3/20. 5 | * () 方法执行顺序 6 | */ 7 | public class ClinitOrder { 8 | static class Parent { 9 | public static int A = 1; 10 | 11 | static { 12 | System.out.println("execute before A = 2, A now is " + A); 13 | A = 2; 14 | } 15 | } 16 | 17 | static class Sub extends Parent { 18 | public static int B = A; 19 | } 20 | 21 | 22 | public static void main(String[] args) { 23 | System.out.println(Sub.B); 24 | } 25 | } 26 | 27 | 28 | -------------------------------------------------------------------------------- /java-jvm/src/main/java/com/brianway/learning/java/jvm/classloading/ConstClass.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.jvm.classloading; 2 | 3 | /** 4 | * Created by brian on 17/3/19. 5 | * 被动使用类字段演示 6 | * 常量在编译阶段会存入调用类的常量池,本质上没有引用调用常量的类, 7 | * 不会触发定义常量的类的初始化 8 | */ 9 | public class ConstClass { 10 | static { 11 | System.out.println("ConsClass init!"); 12 | } 13 | 14 | public static final String HELLOWORLD = "hello world"; 15 | } 16 | -------------------------------------------------------------------------------- /java-jvm/src/main/java/com/brianway/learning/java/jvm/classloading/DeadLoopClass.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.jvm.classloading; 2 | 3 | /** 4 | * Created by brian on 17/3/20. 5 | * 字段解析 6 | * 多个线程同时初始化一个类,只有一个线程会执行 ()方法,其他被阻塞 7 | */ 8 | public class DeadLoopClass { 9 | static { 10 | if (true) { 11 | System.out.println(Thread.currentThread() + " init DeadLoopClass"); 12 | while (true) { 13 | 14 | } 15 | } 16 | } 17 | 18 | public static void main(String[] args) { 19 | Runnable script = () -> { 20 | System.out.println(Thread.currentThread() + " start"); 21 | DeadLoopClass dlc = new DeadLoopClass(); 22 | System.out.println(Thread.currentThread() + " run over"); 23 | }; 24 | 25 | Thread thread1 = new Thread(script); 26 | Thread thread2 = new Thread(script); 27 | thread1.start(); 28 | thread2.start(); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /java-jvm/src/main/java/com/brianway/learning/java/jvm/classloading/FieldResolution.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.jvm.classloading; 2 | 3 | /** 4 | * Created by brian on 17/3/20. 5 | * 字段解析 6 | * 如果注释了 Sub 类中的 "public static int A = 4",会编译错误 7 | */ 8 | public class FieldResolution { 9 | interface Interface0 { 10 | int A = 0; 11 | } 12 | 13 | interface Interface1 extends Interface0 { 14 | int A = 1; 15 | } 16 | 17 | interface Interface2 { 18 | int A = 2; 19 | } 20 | 21 | static class Parent implements Interface1 { 22 | public static int A = 3; 23 | } 24 | 25 | static class Sub extends Parent implements Interface2 { 26 | public static int A = 4;// 注释此句试试 27 | } 28 | 29 | public static void main(String[] args) { 30 | System.out.println(Sub.A); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /java-jvm/src/main/java/com/brianway/learning/java/jvm/classloading/NoInitialization.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.jvm.classloading; 2 | 3 | /** 4 | * Created by brian on 17/3/19. 5 | * 非主动使用类字段演示 6 | * 1. 静态字段只有直接定义这个字段的类才会被初始化 7 | * 2. 通过数组来定义引用类,不会触发类的初始化 8 | * (-XX:+TraceClassLoading,对于 HotSpot 虚拟机可观察到子类的加载) 9 | */ 10 | public class NoInitialization { 11 | public static void main(String[] args) { 12 | System.out.println(SubClass.value); 13 | SubClass[] sca = new SubClass[10]; 14 | 15 | System.out.println(ConstClass.HELLOWORLD); 16 | } 17 | } 18 | /* 19 | SuperClass init! 20 | 123 21 | */ -------------------------------------------------------------------------------- /java-jvm/src/main/java/com/brianway/learning/java/jvm/classloading/SimpleClass.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.jvm.classloading; 2 | 3 | /** 4 | * Created by brian on 17/3/15. 5 | * 一段简单的 Java 代码,用于分析字节码 6 | * javap -verbose SimpleClass.java 7 | */ 8 | public class SimpleClass { 9 | private int m; 10 | 11 | public int inc() { 12 | return m + 1; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /java-jvm/src/main/java/com/brianway/learning/java/jvm/classloading/SubClass.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.jvm.classloading; 2 | 3 | /** 4 | * Created by brian on 17/3/19. 5 | */ 6 | public class SubClass extends SuperClass { 7 | static { 8 | System.out.println("SubClass init!"); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /java-jvm/src/main/java/com/brianway/learning/java/jvm/classloading/SuperClass.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.jvm.classloading; 2 | 3 | /** 4 | * Created by brian on 17/3/19. 5 | * 被动引用的例子 6 | * 通过子类引用父类的静态字段,不会导致子类初始化 7 | */ 8 | public class SuperClass { 9 | static { 10 | System.out.println("SuperClass init!"); 11 | } 12 | 13 | public static int value = 123; 14 | } 15 | -------------------------------------------------------------------------------- /java-jvm/src/main/java/com/brianway/learning/java/jvm/gc/ReferenceCountingGC.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.jvm.gc; 2 | 3 | /** 4 | * Created by brian on 17/3/2. 5 | * 引用计数算法缺陷 6 | */ 7 | public class ReferenceCountingGC { 8 | public Object instance = null; 9 | private static final int _1MB = 1024 * 1024; 10 | 11 | /** 12 | * 占点内存,以便 GC 日志观看 13 | */ 14 | private byte[] bigSize = new byte[2 * _1MB]; 15 | 16 | public static void main(String[] args) { 17 | testGC(); 18 | } 19 | 20 | public static void testGC() { 21 | ReferenceCountingGC objA = new ReferenceCountingGC(); 22 | ReferenceCountingGC objB = new ReferenceCountingGC(); 23 | objA.instance = objB; 24 | objB.instance = objA; 25 | 26 | objA = null; 27 | objB = null; 28 | 29 | System.gc(); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /java-jvm/src/main/java/com/brianway/learning/java/jvm/memory/DirectMemoryOOM.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.jvm.memory; 2 | 3 | import sun.misc.Unsafe; 4 | 5 | import java.lang.reflect.Field; 6 | 7 | /** 8 | * Created by brian on 17/3/2. 9 | * 使用 unsafe 分配本机内存 10 | * VM Args: -Xmx20M -XX:MaxDirectMemorySize=10M 11 | */ 12 | public class DirectMemoryOOM { 13 | private static final int _1MB = 1024 * 1024; 14 | 15 | public static void main(String[] args) throws Exception { 16 | Field unsafeField = Unsafe.class.getDeclaredFields()[0]; 17 | unsafeField.setAccessible(true); 18 | Unsafe unsafe = (Unsafe) unsafeField.get(null); 19 | 20 | while (true) { 21 | unsafe.allocateMemory(_1MB); 22 | } 23 | } 24 | } 25 | 26 | /* 27 | TODO 没出现 OOM 28 | */ -------------------------------------------------------------------------------- /java-jvm/src/main/java/com/brianway/learning/java/jvm/methodinvoke/StaticResolution.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.jvm.methodinvoke; 2 | 3 | /** 4 | * Created by brian on 17/3/20. 5 | * 方法静态解析演示 6 | * javac -verbose StaticResolution.java 7 | * javap -verbose StaticResolution 8 | */ 9 | public class StaticResolution { 10 | public static void sayHello() { 11 | System.out.println("hello world"); 12 | } 13 | 14 | public static void main(String[] args) { 15 | StaticResolution.sayHello(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /java-multithread/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | java-learning 7 | com.brianway.learning.java 8 | 1.0-SNAPSHOT 9 | 10 | 4.0.0 11 | 12 | java-multithread 13 | 14 | 15 | 16 | junit 17 | junit 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/concurrent/CachedThreadPool.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.concurrent; 2 | 3 | import java.util.concurrent.ExecutorService; 4 | import java.util.concurrent.Executors; 5 | 6 | /** 7 | * Created by brian on 16/11/30. 8 | */ 9 | public class CachedThreadPool { 10 | public static void main(String[] args) { 11 | ExecutorService exec = Executors.newCachedThreadPool(); 12 | for (int i = 0; i < 5; i++) { 13 | exec.execute(new LiftOff()); 14 | } 15 | exec.shutdown(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/concurrent/DaemonThreadFactory.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.concurrent; 2 | 3 | import java.util.concurrent.ThreadFactory; 4 | 5 | /** 6 | * Created by brian on 16/12/1. 7 | */ 8 | public class DaemonThreadFactory implements ThreadFactory { 9 | @Override 10 | public Thread newThread(Runnable r) { 11 | Thread t = new Thread(r); 12 | t.setDaemon(true); 13 | return t; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/concurrent/FixedThreadPool.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.concurrent; 2 | 3 | import java.util.concurrent.ExecutorService; 4 | import java.util.concurrent.Executors; 5 | 6 | /** 7 | * Created by brian on 16/11/30. 8 | */ 9 | public class FixedThreadPool { 10 | public static void main(String[] args) { 11 | ExecutorService exec = Executors.newFixedThreadPool(5); 12 | for (int i = 0; i < 5; i++) { 13 | exec.execute(new LiftOff()); 14 | } 15 | exec.shutdown(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/concurrent/LiftOff.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.concurrent; 2 | 3 | /** 4 | * Created by brian on 16/11/30. 5 | */ 6 | public class LiftOff implements Runnable { 7 | protected int countDown = 10; 8 | private static int taskCount = 0; 9 | private final int id = taskCount++; 10 | 11 | public LiftOff() { 12 | } 13 | 14 | public LiftOff(int countDown) { 15 | this.countDown = countDown; 16 | } 17 | 18 | public String status() { 19 | return "#" + id + "(" + (countDown > 0 ? countDown : "LiftOff!") + "), "; 20 | } 21 | 22 | @Override 23 | public void run() { 24 | while (countDown-- > 0) { 25 | System.out.print(status()); 26 | Thread.yield(); 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/concurrent/MoreBasicThreads.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.concurrent; 2 | 3 | /** 4 | * Created by brian on 16/11/30. 5 | */ 6 | public class MoreBasicThreads { 7 | public static void main(String[] args) { 8 | for (int i = 0; i < 5; i++) { 9 | new Thread(new LiftOff()).start(); 10 | } 11 | System.out.println("Waiting for LiftOff"); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/concurrent/SingleThreadExecutor.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.concurrent; 2 | 3 | import java.util.concurrent.ExecutorService; 4 | import java.util.concurrent.Executors; 5 | 6 | /** 7 | * Created by brian on 16/11/30. 8 | */ 9 | public class SingleThreadExecutor { 10 | public static void main(String[] args) { 11 | ExecutorService exec = Executors.newSingleThreadExecutor(); 12 | for (int i = 0; i < 5; i++) { 13 | exec.execute(new LiftOff()); 14 | } 15 | exec.shutdown(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/concurrent/SleepingTask.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.concurrent; 2 | 3 | import java.util.concurrent.ExecutorService; 4 | import java.util.concurrent.Executors; 5 | import java.util.concurrent.TimeUnit; 6 | 7 | /** 8 | * Created by brian on 16/11/30. 9 | */ 10 | public class SleepingTask extends LiftOff { 11 | @Override 12 | public void run() { 13 | try { 14 | while (countDown-- > 0) { 15 | System.out.print(status()); 16 | TimeUnit.MILLISECONDS.sleep(100); 17 | } 18 | } catch (InterruptedException e) { 19 | System.err.println("Interrupted"); 20 | } 21 | } 22 | 23 | public static void main(String[] args) { 24 | ExecutorService exec = Executors.newCachedThreadPool(); 25 | for (int i = 0; i < 5; i++) { 26 | exec.execute(new SleepingTask()); 27 | } 28 | exec.shutdown(); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example1/MyList.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.communication.example1; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | /** 7 | * Created by Brian on 2016/4/13. 8 | */ 9 | public class MyList { 10 | private List list = new ArrayList(); 11 | 12 | public void add() { 13 | list.add("brian"); 14 | } 15 | 16 | public int size() { 17 | return list.size(); 18 | } 19 | } 20 | 21 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example1/ThreadA.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.communication.example1; 2 | 3 | /** 4 | * Created by Brian on 2016/4/13. 5 | */ 6 | public class ThreadA extends Thread { 7 | private MyList list; 8 | 9 | public ThreadA(MyList list) { 10 | super(); 11 | this.list = list; 12 | } 13 | 14 | @Override 15 | public void run() { 16 | for (int i = 0; i < 10; i++) { 17 | list.add(); 18 | System.out.println("添加了" + (i + 1) + "元素"); 19 | try { 20 | Thread.sleep(1000); 21 | } catch (InterruptedException e) { 22 | e.printStackTrace(); 23 | } 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example1/ThreadB.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.communication.example1; 2 | 3 | /** 4 | * Created by Brian on 2016/4/13. 5 | */ 6 | public class ThreadB extends Thread { 7 | private MyList list; 8 | 9 | public ThreadB(MyList list) { 10 | super(); 11 | this.list = list; 12 | } 13 | 14 | @Override 15 | public void run() { 16 | try { 17 | while (true) { 18 | //System.out.println("in b while: "+list.size()); 19 | //synchronized ("any"){} 20 | if (list.size() == 5) { 21 | System.out.println("达到size了,线程b要退出了"); 22 | throw new InterruptedException(); 23 | } 24 | } 25 | } catch (InterruptedException e) { 26 | e.printStackTrace(); 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example10/C_Thread.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.communication.example10; 2 | 3 | /** 4 | * Created by Brian on 2016/4/14. 5 | */ 6 | public class C_Thread extends Thread { 7 | private Consumer c; 8 | 9 | public C_Thread(Consumer c) { 10 | super(); 11 | this.c = c; 12 | } 13 | 14 | @Override 15 | public void run() { 16 | while (true) { 17 | c.popService(); 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example10/Consumer.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.communication.example10; 2 | 3 | /** 4 | * Created by Brian on 2016/4/14. 5 | */ 6 | public class Consumer { 7 | private MyStack myStack; 8 | 9 | public Consumer(MyStack myStack) { 10 | super(); 11 | this.myStack = myStack; 12 | } 13 | 14 | public void popService() { 15 | System.out.println("pop = " + myStack.pop() + " Consumer的popService方法中打印pop返回值"); 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example10/P_Thread.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.communication.example10; 2 | 3 | /** 4 | * Created by Brian on 2016/4/14. 5 | */ 6 | public class P_Thread extends Thread { 7 | private Producer p; 8 | 9 | public P_Thread(Producer p) { 10 | super(); 11 | this.p = p; 12 | } 13 | 14 | @Override 15 | public void run() { 16 | while (true) { 17 | p.pushService(); 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example10/Producer.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.communication.example10; 2 | 3 | /** 4 | * Created by Brian on 2016/4/14. 5 | */ 6 | public class Producer { 7 | private MyStack myStack; 8 | 9 | public Producer(MyStack myStack) { 10 | super(); 11 | this.myStack = myStack; 12 | } 13 | 14 | public void pushService() { 15 | myStack.push(); 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example11/C_Thread.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.communication.example11; 2 | 3 | /** 4 | * Created by Brian on 2016/4/14. 5 | */ 6 | public class C_Thread extends Thread { 7 | private Consumer c; 8 | 9 | public C_Thread(Consumer c) { 10 | super(); 11 | this.c = c; 12 | } 13 | 14 | @Override 15 | public void run() { 16 | while (true) { 17 | c.popService(); 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example11/Consumer.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.communication.example11; 2 | 3 | /** 4 | * Created by Brian on 2016/4/14. 5 | */ 6 | public class Consumer { 7 | private MyStack myStack; 8 | 9 | public Consumer(MyStack myStack) { 10 | super(); 11 | this.myStack = myStack; 12 | } 13 | 14 | public void popService() { 15 | System.out.println("pop = " + myStack.pop() + " Consumer的popService方法中打印pop返回值"); 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example11/P_Thread.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.communication.example11; 2 | 3 | /** 4 | * Created by Brian on 2016/4/14. 5 | */ 6 | public class P_Thread extends Thread { 7 | private Producer p; 8 | 9 | public P_Thread(Producer p) { 10 | super(); 11 | this.p = p; 12 | } 13 | 14 | @Override 15 | public void run() { 16 | while (true) { 17 | p.pushService(); 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example11/Producer.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.communication.example11; 2 | 3 | /** 4 | * Created by Brian on 2016/4/14. 5 | */ 6 | public class Producer { 7 | private MyStack myStack; 8 | 9 | public Producer(MyStack myStack) { 10 | super(); 11 | this.myStack = myStack; 12 | } 13 | 14 | public void pushService() { 15 | myStack.push(); 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example12/ReadData.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.communication.example12; 2 | 3 | import java.io.IOException; 4 | import java.io.PipedInputStream; 5 | 6 | /** 7 | * Created by Brian on 2016/4/14. 8 | */ 9 | public class ReadData { 10 | public void readMethod(PipedInputStream input) { 11 | try { 12 | System.out.println("read :"); 13 | byte[] bytes = new byte[20]; 14 | int readLength = input.read(bytes); 15 | while (readLength != -1) { 16 | String newData = new String(bytes, 0, readLength); 17 | System.out.print(newData); 18 | readLength = input.read(bytes); 19 | } 20 | } catch (IOException e) { 21 | e.printStackTrace(); 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example12/ThreadRead.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.communication.example12; 2 | 3 | import java.io.PipedInputStream; 4 | 5 | /** 6 | * Created by Brian on 2016/4/14. 7 | */ 8 | public class ThreadRead extends Thread { 9 | private ReadData read; 10 | private PipedInputStream input; 11 | 12 | public ThreadRead(ReadData read, PipedInputStream input) { 13 | super(); 14 | this.input = input; 15 | this.read = read; 16 | } 17 | 18 | @Override 19 | public void run() { 20 | read.readMethod(input); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example12/ThreadWrite.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.communication.example12; 2 | 3 | import java.io.PipedOutputStream; 4 | 5 | /** 6 | * Created by Brian on 2016/4/14. 7 | */ 8 | public class ThreadWrite extends Thread { 9 | private WriteData write; 10 | private PipedOutputStream out; 11 | 12 | public ThreadWrite(WriteData write, PipedOutputStream out) { 13 | super(); 14 | this.write = write; 15 | this.out = out; 16 | } 17 | 18 | @Override 19 | public void run() { 20 | write.writeMethod(out); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example12/WriteData.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.communication.example12; 2 | 3 | import java.io.IOException; 4 | import java.io.PipedOutputStream; 5 | 6 | /** 7 | * Created by Brian on 2016/4/14. 8 | */ 9 | public class WriteData { 10 | public void writeMethod(PipedOutputStream out) { 11 | try { 12 | System.out.println("write :"); 13 | for (int i = 0; i < 300; i++) { 14 | String outData = "" + (i + 1); 15 | out.write(outData.getBytes()); 16 | System.out.print(outData); 17 | } 18 | System.out.println(); 19 | out.close(); 20 | } catch (IOException e) { 21 | e.printStackTrace(); 22 | } 23 | 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example13/BackupA.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.communication.example13; 2 | 3 | /** 4 | * Created by Brian on 2016/4/14. 5 | */ 6 | public class BackupA extends Thread { 7 | private DBTools dbTools; 8 | 9 | public BackupA(DBTools dbTools) { 10 | super(); 11 | this.dbTools = dbTools; 12 | } 13 | 14 | @Override 15 | public void run() { 16 | dbTools.backupA(); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example13/BackupB.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.communication.example13; 2 | 3 | /** 4 | * Created by Brian on 2016/4/14. 5 | */ 6 | public class BackupB extends Thread { 7 | private DBTools dbTools; 8 | 9 | public BackupB(DBTools dbTools) { 10 | super(); 11 | this.dbTools = dbTools; 12 | } 13 | 14 | @Override 15 | public void run() { 16 | dbTools.backupB(); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example14/Run14_joinExption.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.communication.example14; 2 | 3 | /** 4 | * Created by Brian on 2016/4/14. 5 | */ 6 | 7 | /** 8 | * P181 9 | * join的异常 10 | * 线程b被中断了,但a还在正常运行 11 | */ 12 | public class Run14_joinExption { 13 | public static void main(String[] args) { 14 | try { 15 | ThreadB b = new ThreadB(); 16 | b.start(); 17 | Thread.sleep(500); 18 | ThreadC c = new ThreadC(b); 19 | c.start(); 20 | } catch (InterruptedException e) { 21 | e.printStackTrace(); 22 | } 23 | } 24 | } 25 | 26 | /* 27 | 输出: 28 | 线程B在catch处打印了 29 | java.lang.InterruptedException 30 | at java.lang.Object.wait(Native Method) 31 | at java.lang.Thread.join(Thread.java:1245) 32 | at java.lang.Thread.join(Thread.java:1319) 33 | at com.brianway.learning.java.multithread.communication.example14.ThreadB.run(ThreadB.java:12) 34 | */ -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example14/ThreadA.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.communication.example14; 2 | 3 | /** 4 | * Created by Brian on 2016/4/14. 5 | */ 6 | public class ThreadA extends Thread { 7 | @Override 8 | public void run() { 9 | for (int i = 0; i < Integer.MAX_VALUE; i++) { 10 | String newString = new String(); 11 | Math.random(); 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example14/ThreadB.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.communication.example14; 2 | 3 | /** 4 | * Created by Brian on 2016/4/14. 5 | */ 6 | public class ThreadB extends Thread { 7 | @Override 8 | public void run() { 9 | try { 10 | ThreadA a = new ThreadA(); 11 | a.start(); 12 | a.join(); 13 | System.out.println("线程B在run end处打印了"); 14 | } catch (InterruptedException e) { 15 | System.out.println("线程B在catch处打印了"); 16 | e.printStackTrace(); 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example14/ThreadC.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.communication.example14; 2 | 3 | /** 4 | * Created by Brian on 2016/4/14. 5 | */ 6 | public class ThreadC extends Thread { 7 | 8 | private ThreadB b; 9 | 10 | public ThreadC(ThreadB b) { 11 | super(); 12 | this.b = b; 13 | } 14 | 15 | @Override 16 | public void run() { 17 | b.interrupt(); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example15/Run15_join_sleep.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.communication.example15; 2 | 3 | /** 4 | * Created by Brian on 2016/4/14. 5 | */ 6 | 7 | /** 8 | * P185 9 | * join(long)和sleep(long)的区别 10 | * sleep(long)方法不释放锁 11 | */ 12 | public class Run15_join_sleep { 13 | public static void main(String[] args) { 14 | try { 15 | ThreadB b = new ThreadB(); 16 | ThreadA a = new ThreadA(b); 17 | a.start(); 18 | Thread.sleep(1000); 19 | ThreadC c = new ThreadC(b); 20 | c.start(); 21 | } catch (InterruptedException e) { 22 | e.printStackTrace(); 23 | } 24 | } 25 | } 26 | 27 | /* 28 | 输出: 29 | b run begin timer=1460637031625 30 | b run end timer=1460637036626 31 | 打印了bService timer=1460637037626 32 | 33 | 34 | 35 | */ -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example15/ThreadA.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.communication.example15; 2 | 3 | /** 4 | * Created by Brian on 2016/4/14. 5 | */ 6 | public class ThreadA extends Thread { 7 | private ThreadB b; 8 | 9 | public ThreadA(ThreadB b) { 10 | super(); 11 | this.b = b; 12 | } 13 | 14 | @Override 15 | public void run() { 16 | try { 17 | synchronized (b) { 18 | b.start(); 19 | Thread.sleep(6000); 20 | } 21 | } catch (InterruptedException e) { 22 | e.printStackTrace(); 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example15/ThreadB.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.communication.example15; 2 | 3 | /** 4 | * Created by Brian on 2016/4/14. 5 | */ 6 | public class ThreadB extends Thread { 7 | @Override 8 | public void run() { 9 | try { 10 | System.out.println("b run begin timer=" + System.currentTimeMillis()); 11 | Thread.sleep(5000); 12 | System.out.println("b run end timer=" + System.currentTimeMillis()); 13 | } catch (InterruptedException e) { 14 | e.printStackTrace(); 15 | } 16 | } 17 | 18 | synchronized public void bService() { 19 | System.out.println("打印了bService timer=" + System.currentTimeMillis()); 20 | } 21 | 22 | } 23 | 24 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example15/ThreadC.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.communication.example15; 2 | 3 | /** 4 | * Created by Brian on 2016/4/14. 5 | */ 6 | public class ThreadC extends Thread { 7 | 8 | private ThreadB b; 9 | 10 | public ThreadC(ThreadB b) { 11 | super(); 12 | this.b = b; 13 | } 14 | 15 | @Override 16 | public void run() { 17 | b.bService(); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example16/InheritableThreadLocalExt.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.communication.example16; 2 | 3 | import java.util.Date; 4 | 5 | /** 6 | * Created by Brian on 2016/4/14. 7 | */ 8 | public class InheritableThreadLocalExt extends InheritableThreadLocal { 9 | @Override 10 | protected Object initialValue() { 11 | return new Date().getTime(); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example16/InheritableThreadLocalExt2.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.communication.example16; 2 | 3 | import java.util.Date; 4 | 5 | /** 6 | * Created by Brian on 2016/4/14. 7 | */ 8 | public class InheritableThreadLocalExt2 extends InheritableThreadLocal { 9 | @Override 10 | protected Object initialValue() { 11 | return new Date().getTime(); 12 | } 13 | 14 | @Override 15 | protected Object childValue(Object parentValue) { 16 | return parentValue + "我在子线程加的~"; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example16/ThreadA.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.communication.example16; 2 | 3 | /** 4 | * Created by Brian on 2016/4/14. 5 | */ 6 | public class ThreadA extends Thread { 7 | @Override 8 | public void run() { 9 | try { 10 | for (int i = 0; i < 10; i++) { 11 | System.out.println("在ThreadA线程中取值=" + Tools.tl.get()); 12 | Thread.sleep(100); 13 | } 14 | } catch (InterruptedException e) { 15 | e.printStackTrace(); 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example16/ThreadB.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.communication.example16; 2 | 3 | /** 4 | * Created by Brian on 2016/4/14. 5 | */ 6 | public class ThreadB extends Thread { 7 | @Override 8 | public void run() { 9 | try { 10 | for (int i = 0; i < 10; i++) { 11 | System.out.println("在ThreadB线程中取值=" + Tools.itl.get()); 12 | Thread.sleep(100); 13 | } 14 | } catch (InterruptedException e) { 15 | e.printStackTrace(); 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example16/ThreadC.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.communication.example16; 2 | 3 | /** 4 | * Created by Brian on 2016/4/14. 5 | */ 6 | public class ThreadC extends Thread { 7 | @Override 8 | public void run() { 9 | try { 10 | for (int i = 0; i < 10; i++) { 11 | System.out.println("在ThreadC线程中取值=" + Tools.itl2.get()); 12 | Thread.sleep(100); 13 | } 14 | } catch (InterruptedException e) { 15 | e.printStackTrace(); 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example16/ThreadLocalExt.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.communication.example16; 2 | 3 | import java.util.Date; 4 | 5 | /** 6 | * Created by Brian on 2016/4/14. 7 | */ 8 | public class ThreadLocalExt extends ThreadLocal { 9 | @Override 10 | protected Object initialValue() { 11 | return new Date().getTime(); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example16/Tools.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.communication.example16; 2 | 3 | /** 4 | * Created by Brian on 2016/4/14. 5 | */ 6 | public class Tools { 7 | public static ThreadLocalExt tl = new ThreadLocalExt(); 8 | public static InheritableThreadLocalExt itl = new InheritableThreadLocalExt(); 9 | public static InheritableThreadLocalExt2 itl2 = new InheritableThreadLocalExt2(); 10 | 11 | } 12 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example2/Run2_wait.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.communication.example2; 2 | 3 | /** 4 | * Created by Brian on 2016/4/13. 5 | */ 6 | 7 | /** 8 | * P137 9 | * wait()永远阻塞 10 | */ 11 | public class Run2_wait { 12 | public static void main(String[] args) { 13 | try { 14 | String lock = new String(); 15 | System.out.println("syn上面"); 16 | synchronized (lock) { 17 | System.out.println("syn第一行,wait前面"); 18 | lock.wait(); 19 | System.out.println("wait下面的代码"); 20 | } 21 | System.out.println("syn下面的代码"); 22 | } catch (InterruptedException e) { 23 | e.printStackTrace(); 24 | } 25 | } 26 | } 27 | 28 | /* 29 | 输出: 30 | syn上面 31 | syn第一行,wait前面 32 | */ -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example2/Thread1.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.communication.example2; 2 | 3 | /** 4 | * Created by Brian on 2016/4/13. 5 | */ 6 | public class Thread1 extends Thread { 7 | private Object lock; 8 | 9 | public Thread1(Object lock) { 10 | super(); 11 | this.lock = lock; 12 | } 13 | 14 | @Override 15 | public void run() { 16 | try { 17 | synchronized (lock) { 18 | System.out.println("开始 wait time=" + System.currentTimeMillis()); 19 | lock.wait(); 20 | System.out.println("结束 wait time=" + System.currentTimeMillis()); 21 | } 22 | } catch (InterruptedException e) { 23 | e.printStackTrace(); 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example2/Thread2.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.communication.example2; 2 | 3 | /** 4 | * Created by Brian on 2016/4/13. 5 | */ 6 | public class Thread2 extends Thread { 7 | private Object lock; 8 | 9 | public Thread2(Object lock) { 10 | super(); 11 | this.lock = lock; 12 | } 13 | 14 | @Override 15 | public void run() { 16 | 17 | synchronized (lock) { 18 | System.out.println("开始 notify time=" + System.currentTimeMillis()); 19 | lock.notify(); 20 | try { 21 | Thread.sleep(2000); 22 | } catch (InterruptedException e) { 23 | e.printStackTrace(); 24 | } 25 | System.out.println("结束 notify time=" + System.currentTimeMillis()); 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example3/MyThread.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.communication.example3; 2 | 3 | /** 4 | * Created by brian on 2016/4/14. 5 | */ 6 | public class MyThread extends Thread { 7 | private Object lock; 8 | 9 | public MyThread(Object lock) { 10 | super(); 11 | this.lock = lock; 12 | } 13 | 14 | @Override 15 | public void run() { 16 | Service service = new Service(); 17 | service.testMethod(lock); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example3/NotifyThread.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.communication.example3; 2 | 3 | /** 4 | * Created by brian on 2016/4/14. 5 | */ 6 | public class NotifyThread extends Thread { 7 | private Object lock; 8 | 9 | public NotifyThread(Object lock) { 10 | super(); 11 | this.lock = lock; 12 | } 13 | 14 | @Override 15 | public void run() { 16 | synchronized (lock) { 17 | lock.notify(); 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example3/NotifyThread2.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.communication.example3; 2 | 3 | /** 4 | * Created by brian on 2016/4/14. 5 | */ 6 | public class NotifyThread2 extends Thread { 7 | private Object lock; 8 | 9 | public NotifyThread2(Object lock) { 10 | super(); 11 | this.lock = lock; 12 | } 13 | 14 | @Override 15 | public void run() { 16 | synchronized (lock) { 17 | lock.notify(); 18 | lock.notify(); 19 | lock.notify(); 20 | lock.notify(); 21 | 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example3/NotifyThread3.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.communication.example3; 2 | 3 | /** 4 | * Created by brian on 2016/4/14. 5 | */ 6 | public class NotifyThread3 extends Thread { 7 | private Object lock; 8 | 9 | public NotifyThread3(Object lock) { 10 | super(); 11 | this.lock = lock; 12 | } 13 | 14 | @Override 15 | public void run() { 16 | synchronized (lock) { 17 | lock.notifyAll(); 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example3/Run3_notifyMany.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.communication.example3; 2 | 3 | /** 4 | * Created by brian on 2016/4/14. 5 | */ 6 | 7 | /** 8 | * P150 9 | * 通知多个线程 10 | */ 11 | public class Run3_notifyMany { 12 | public static void main(String[] args) throws InterruptedException { 13 | Object lock = new Object(); 14 | MyThread a = new MyThread(lock); 15 | a.start(); 16 | MyThread b = new MyThread(lock); 17 | b.start(); 18 | MyThread c = new MyThread(lock); 19 | c.start(); 20 | 21 | Thread.sleep(1000); 22 | 23 | NotifyThread2 notifyThread = new NotifyThread2(lock); 24 | notifyThread.start(); 25 | } 26 | } 27 | 28 | /* 29 | 输出: 30 | begin wait(),ThreadName=Thread-0 31 | begin wait(),ThreadName=Thread-2 32 | begin wait(),ThreadName=Thread-1 33 | end wait(),ThreadName=Thread-0 34 | end wait(),ThreadName=Thread-1 35 | end wait(),ThreadName=Thread-2 36 | 37 | */ -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example3/Run3_notifyOne.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.communication.example3; 2 | 3 | /** 4 | * Created by brian on 2016/4/14. 5 | */ 6 | 7 | /** 8 | * P149 9 | * 通知一个线程 10 | */ 11 | public class Run3_notifyOne { 12 | public static void main(String[] args) throws InterruptedException { 13 | Object lock = new Object(); 14 | MyThread a = new MyThread(lock); 15 | a.start(); 16 | MyThread b = new MyThread(lock); 17 | b.start(); 18 | MyThread c = new MyThread(lock); 19 | c.start(); 20 | 21 | Thread.sleep(1000); 22 | 23 | NotifyThread notifyThread = new NotifyThread(lock); 24 | notifyThread.start(); 25 | } 26 | } 27 | 28 | /* 29 | 输出: 30 | begin wait(),ThreadName=Thread-1 31 | begin wait(),ThreadName=Thread-2 32 | begin wait(),ThreadName=Thread-0 33 | end wait(),ThreadName=Thread-1 34 | 35 | */ -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example3/Service.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.communication.example3; 2 | 3 | /** 4 | * Created by brian on 2016/4/14. 5 | */ 6 | public class Service { 7 | public void testMethod(Object lock) { 8 | try { 9 | synchronized (lock) { 10 | System.out.println("begin wait(),ThreadName=" + Thread.currentThread().getName()); 11 | lock.wait(); 12 | System.out.println("end wait(),ThreadName=" + Thread.currentThread().getName()); 13 | } 14 | } catch (InterruptedException e) { 15 | e.printStackTrace(); 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example5/Run5_notify.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.communication.example5; 2 | 3 | /** 4 | * Created by brian on 2016/4/14. 5 | */ 6 | 7 | /** 8 | * P154 9 | * notify正常通知 10 | */ 11 | public class Run5_notify { 12 | public static void main(String[] args) throws InterruptedException { 13 | MyRun myRun = new MyRun(); 14 | Thread a = new Thread(myRun.runnableWait); 15 | a.start(); 16 | Thread.sleep(100); 17 | Thread b = new Thread(myRun.runnableNotify); 18 | b.start(); 19 | } 20 | 21 | } 22 | 23 | /* 24 | 输出: 25 | wait begin timer=1460567668037 26 | notify begin timer=1460567668137 27 | notify end timer=1460567668137 28 | wait end timer=1460567668137 29 | */ -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example5/Run5_notifyEarly.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.communication.example5; 2 | 3 | /** 4 | * Created by brian on 2016/4/14. 5 | */ 6 | 7 | /** 8 | * P154 9 | * notify通知过早 10 | */ 11 | public class Run5_notifyEarly { 12 | public static void main(String[] args) throws InterruptedException { 13 | MyRun myRun = new MyRun(); 14 | Thread b = new Thread(myRun.runnableNotify); 15 | b.start(); 16 | Thread.sleep(100); 17 | Thread a = new Thread(myRun.runnableWait); 18 | a.start(); 19 | } 20 | 21 | } 22 | 23 | /* 24 | 输出: 25 | notify begin timer=1460567514794 26 | notify end timer=1460567514794 27 | */ -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example6/Add.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.communication.example6; 2 | 3 | /** 4 | * Created by Brian on 2016/4/14. 5 | */ 6 | public class Add { 7 | private String lock; 8 | 9 | public Add(String lock) { 10 | super(); 11 | this.lock = lock; 12 | } 13 | 14 | public void add() { 15 | synchronized (lock) { 16 | ValueObject.list.add("anyString"); 17 | lock.notifyAll(); 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example6/ThreadAdd.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.communication.example6; 2 | 3 | /** 4 | * Created by Brian on 2016/4/14. 5 | */ 6 | public class ThreadAdd extends Thread { 7 | private Add add; 8 | 9 | public ThreadAdd(String name, Add add) { 10 | super(name); 11 | this.add = add; 12 | } 13 | 14 | @Override 15 | public void run() { 16 | add.add(); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example6/ThreadSubtract.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.communication.example6; 2 | 3 | /** 4 | * Created by Brian on 2016/4/14. 5 | */ 6 | public class ThreadSubtract extends Thread { 7 | private Subtract subtract; 8 | 9 | public ThreadSubtract(String name, Subtract subtract) { 10 | super(name); 11 | this.subtract = subtract; 12 | } 13 | 14 | @Override 15 | public void run() { 16 | subtract.subtract(); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example6/ValueObject.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.communication.example6; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | /** 7 | * Created by Brian on 2016/4/14. 8 | */ 9 | public class ValueObject { 10 | public static List list = new ArrayList(); 11 | } 12 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example7/Consumer.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.communication.example7; 2 | 3 | /** 4 | * Created by Brian on 2016/4/14. 5 | */ 6 | public class Consumer { 7 | private String lock; 8 | 9 | public Consumer(String lock) { 10 | super(); 11 | this.lock = lock; 12 | } 13 | 14 | public void getValue() { 15 | try { 16 | synchronized (lock) { 17 | if (ValueObject.value.equals("")) { 18 | lock.wait(); 19 | } 20 | System.out.println("get的值是" + ValueObject.value); 21 | ValueObject.value = ""; 22 | lock.notify(); 23 | } 24 | } catch (InterruptedException e) { 25 | e.printStackTrace(); 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example7/ThreadC.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.communication.example7; 2 | 3 | /** 4 | * Created by Brian on 2016/4/14. 5 | */ 6 | public class ThreadC extends Thread { 7 | private Consumer c; 8 | 9 | public ThreadC(Consumer c) { 10 | super(); 11 | this.c = c; 12 | } 13 | 14 | @Override 15 | public void run() { 16 | while (true) { 17 | c.getValue(); 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example7/ThreadP.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.communication.example7; 2 | 3 | /** 4 | * Created by Brian on 2016/4/14. 5 | */ 6 | public class ThreadP extends Thread { 7 | private Producer p; 8 | 9 | public ThreadP(Producer p) { 10 | super(); 11 | this.p = p; 12 | } 13 | 14 | @Override 15 | public void run() { 16 | while (true) { 17 | p.setValue(); 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example7/ValueObject.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.communication.example7; 2 | 3 | /** 4 | * Created by Brian on 2016/4/14. 5 | */ 6 | public class ValueObject { 7 | public static String value = ""; 8 | } 9 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example7/producer.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.communication.example7; 2 | 3 | /** 4 | * Created by Brian on 2016/4/14. 5 | */ 6 | public class Producer { 7 | private String lock; 8 | 9 | public Producer(String lock) { 10 | super(); 11 | this.lock = lock; 12 | } 13 | 14 | public void setValue() { 15 | try { 16 | synchronized (lock) { 17 | if (!ValueObject.value.equals("")) { 18 | lock.wait(); 19 | } 20 | String value = System.currentTimeMillis() + "_" + System.nanoTime(); 21 | System.out.println("set的值是" + value); 22 | ValueObject.value = value; 23 | lock.notify(); 24 | } 25 | } catch (InterruptedException e) { 26 | e.printStackTrace(); 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example8/Consumer.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.communication.example8; 2 | 3 | /** 4 | * Created by Brian on 2016/4/14. 5 | */ 6 | public class Consumer { 7 | private String lock; 8 | 9 | public Consumer(String lock) { 10 | super(); 11 | this.lock = lock; 12 | } 13 | 14 | public void getValue() { 15 | try { 16 | synchronized (lock) { 17 | while (ValueObject.value.equals("")) { 18 | System.out.println("消费者 " + Thread.currentThread().getName() + " WAITING了☆"); 19 | lock.wait(); 20 | } 21 | System.out.println("消费者 " + Thread.currentThread().getName() + " RUNNABLE了"); 22 | ValueObject.value = ""; 23 | lock.notify(); 24 | } 25 | } catch (InterruptedException e) { 26 | e.printStackTrace(); 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example8/ThreadC.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.communication.example8; 2 | 3 | /** 4 | * Created by Brian on 2016/4/14. 5 | */ 6 | public class ThreadC extends Thread { 7 | private Consumer c; 8 | 9 | public ThreadC(Consumer c) { 10 | super(); 11 | this.c = c; 12 | } 13 | 14 | @Override 15 | public void run() { 16 | while (true) { 17 | c.getValue(); 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example8/ThreadP.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.communication.example8; 2 | 3 | /** 4 | * Created by Brian on 2016/4/14. 5 | */ 6 | public class ThreadP extends Thread { 7 | private Producer p; 8 | 9 | public ThreadP(Producer p) { 10 | super(); 11 | this.p = p; 12 | } 13 | 14 | @Override 15 | public void run() { 16 | while (true) { 17 | p.setValue(); 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example8/ValueObject.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.communication.example8; 2 | 3 | /** 4 | * Created by Brian on 2016/4/14. 5 | */ 6 | public class ValueObject { 7 | public static String value = ""; 8 | } 9 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example9/C_Thread.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.communication.example9; 2 | 3 | /** 4 | * Created by Brian on 2016/4/14. 5 | */ 6 | public class C_Thread extends Thread { 7 | private Consumer c; 8 | 9 | public C_Thread(Consumer c) { 10 | super(); 11 | this.c = c; 12 | } 13 | 14 | @Override 15 | public void run() { 16 | while (true) { 17 | c.popService(); 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example9/Consumer.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.communication.example9; 2 | 3 | /** 4 | * Created by Brian on 2016/4/14. 5 | */ 6 | public class Consumer { 7 | private MyStack myStack; 8 | 9 | public Consumer(MyStack myStack) { 10 | super(); 11 | this.myStack = myStack; 12 | } 13 | 14 | public void popService() { 15 | System.out.println("pop = " + myStack.pop() + " Consumer的popService方法中打印pop返回值"); 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example9/P_Thread.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.communication.example9; 2 | 3 | /** 4 | * Created by Brian on 2016/4/14. 5 | */ 6 | public class P_Thread extends Thread { 7 | private Producer p; 8 | 9 | public P_Thread(Producer p) { 10 | super(); 11 | this.p = p; 12 | } 13 | 14 | @Override 15 | public void run() { 16 | while (true) { 17 | p.pushService(); 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example9/Producer.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.communication.example9; 2 | 3 | /** 4 | * Created by Brian on 2016/4/14. 5 | */ 6 | public class Producer { 7 | private MyStack myStack; 8 | 9 | public Producer(MyStack myStack) { 10 | super(); 11 | this.myStack = myStack; 12 | } 13 | 14 | public void pushService() { 15 | myStack.push(); 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example1/Run1_UseConditionWaitNotify.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.lock.example1; 2 | 3 | /** 4 | * Created by brian on 2016/4/15. 5 | */ 6 | 7 | /** 8 | * P206 9 | * 使用Condition实现等待通知 10 | * Condition对象的await()方法,线程WAITING 11 | */ 12 | public class Run1_UseConditionWaitNotify { 13 | public static void main(String[] args) { 14 | ServiceB service = new ServiceB(); 15 | ThreadB b = new ThreadB(service); 16 | b.start(); 17 | } 18 | } 19 | 20 | 21 | /* 22 | 输出: 23 | A 24 | */ -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example1/Run1_UseConditionWaitNotifyOk.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.lock.example1; 2 | 3 | /** 4 | * Created by brian on 2016/4/15. 5 | */ 6 | 7 | /** 8 | * P207 9 | * 正确使用Condition实现等待通知 10 | * Object类的wait()------Condition类的await() 11 | * Object类的wait(long timeout)------Condition类的await(long time,TimeUnit unit) 12 | * Object类的notify()------Condition类的signal() 13 | * Object类的notifyAll()------Condition类的signalAll() 14 | */ 15 | public class Run1_UseConditionWaitNotifyOk { 16 | public static void main(String[] args) throws InterruptedException { 17 | ServiceC service = new ServiceC(); 18 | ThreadC c = new ThreadC(service); 19 | c.start(); 20 | Thread.sleep(3000); 21 | service.signal(); 22 | } 23 | } 24 | 25 | 26 | /* 27 | 输出: 28 | await 时间为1460651340418 29 | signal时间为1460651343418 30 | 锁释放了 31 | */ -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example1/ServiceA.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.lock.example1; 2 | 3 | import java.util.concurrent.locks.Condition; 4 | import java.util.concurrent.locks.Lock; 5 | import java.util.concurrent.locks.ReentrantLock; 6 | 7 | /** 8 | * Created by brian on 2016/4/15. 9 | */ 10 | public class ServiceA { 11 | private Lock lock = new ReentrantLock(); 12 | private Condition condition = lock.newCondition(); 13 | 14 | public void await() { 15 | try { 16 | condition.await(); 17 | } catch (InterruptedException e) { 18 | e.printStackTrace(); 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example1/ServiceB.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.lock.example1; 2 | 3 | import java.util.concurrent.locks.Condition; 4 | import java.util.concurrent.locks.Lock; 5 | import java.util.concurrent.locks.ReentrantLock; 6 | 7 | /** 8 | * Created by brian on 2016/4/15. 9 | */ 10 | public class ServiceB { 11 | private Lock lock = new ReentrantLock(); 12 | private Condition condition = lock.newCondition(); 13 | 14 | public void waitMethod() { 15 | try { 16 | lock.lock(); 17 | System.out.println("A"); 18 | condition.await(); 19 | System.out.println("B"); 20 | } catch (InterruptedException e) { 21 | e.printStackTrace(); 22 | } finally { 23 | lock.unlock(); 24 | System.out.println("锁释放了"); 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example1/ThreadA.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.lock.example1; 2 | 3 | /** 4 | * Created by brian on 2016/4/15. 5 | */ 6 | public class ThreadA extends Thread { 7 | private ServiceA service; 8 | 9 | public ThreadA(ServiceA service) { 10 | this.service = service; 11 | } 12 | 13 | @Override 14 | public void run() { 15 | service.await(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example1/ThreadB.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.lock.example1; 2 | 3 | /** 4 | * Created by brian on 2016/4/15. 5 | */ 6 | public class ThreadB extends Thread { 7 | private ServiceB service; 8 | 9 | public ThreadB(ServiceB service) { 10 | this.service = service; 11 | } 12 | 13 | @Override 14 | public void run() { 15 | service.waitMethod(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example1/ThreadC.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.lock.example1; 2 | 3 | /** 4 | * Created by brian on 2016/4/15. 5 | */ 6 | public class ThreadC extends Thread { 7 | private ServiceC service; 8 | 9 | public ThreadC(ServiceC service) { 10 | this.service = service; 11 | } 12 | 13 | @Override 14 | public void run() { 15 | service.await(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example10/Run10_ReadWriteLockBegin1.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.lock.example10; 2 | 3 | /** 4 | * Created by Brian on 2016/4/15. 5 | */ 6 | 7 | /** 8 | * P236 9 | * 类ReentrantReadWriteLock的使用:读读共享 10 | */ 11 | public class Run10_ReadWriteLockBegin1 { 12 | public static void main(String[] args) { 13 | final Service1 service = new Service1(); 14 | Thread a = new Thread() { 15 | @Override 16 | public void run() { 17 | service.read(); 18 | } 19 | }; 20 | Thread b = new Thread() { 21 | @Override 22 | public void run() { 23 | service.read(); 24 | } 25 | }; 26 | a.setName("A"); 27 | a.start(); 28 | b.setName("B"); 29 | b.start(); 30 | } 31 | } 32 | 33 | 34 | /* 35 | 输出: 36 | 获得读锁A 1460726504907 37 | 获得读锁B 1460726504908 38 | */ -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example10/Run10_ReadWriteLockBegin2.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.lock.example10; 2 | 3 | /** 4 | * Created by Brian on 2016/4/15. 5 | */ 6 | 7 | /** 8 | * P238 9 | * 类ReentrantReadWriteLock的使用:写写互斥 10 | */ 11 | public class Run10_ReadWriteLockBegin2 { 12 | public static void main(String[] args) { 13 | final Service2 service = new Service2(); 14 | Thread a = new Thread() { 15 | @Override 16 | public void run() { 17 | service.write(); 18 | } 19 | }; 20 | Thread b = new Thread() { 21 | @Override 22 | public void run() { 23 | service.write(); 24 | } 25 | }; 26 | a.setName("A"); 27 | a.start(); 28 | b.setName("B"); 29 | b.start(); 30 | } 31 | } 32 | 33 | 34 | /* 35 | 输出: 36 | 获得写锁A 1460727106721 37 | 获得写锁B 1460727116721 38 | */ -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example10/Run10_ReadWriteLockBegin3.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.lock.example10; 2 | 3 | /** 4 | * Created by Brian on 2016/4/15. 5 | */ 6 | 7 | /** 8 | * P238 9 | * 类ReentrantReadWriteLock的使用:读写互斥 10 | */ 11 | public class Run10_ReadWriteLockBegin3 { 12 | public static void main(String[] args) { 13 | final Service3 service = new Service3(); 14 | Thread a = new Thread() { 15 | @Override 16 | public void run() { 17 | service.read(); 18 | } 19 | }; 20 | Thread b = new Thread() { 21 | @Override 22 | public void run() { 23 | service.write(); 24 | } 25 | }; 26 | a.setName("A"); 27 | a.start(); 28 | b.setName("B"); 29 | b.start(); 30 | } 31 | } 32 | 33 | 34 | /* 35 | 输出: 36 | 获得读锁 A 1460727280066 37 | 获得写锁 B 1460727290067 38 | */ -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example10/Service1.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.lock.example10; 2 | 3 | import java.util.concurrent.locks.ReentrantReadWriteLock; 4 | 5 | /** 6 | * Created by Brian on 2016/4/15. 7 | */ 8 | 9 | /** 10 | * TODO 11 | * 这里为什么用双try? 12 | * 以前不都是直接try catch finally的吗? 13 | */ 14 | public class Service1 { 15 | private ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); 16 | 17 | public void read() { 18 | try { 19 | try { 20 | lock.readLock().lock(); 21 | System.out.println("获得读锁" + Thread.currentThread().getName() + " " + System.currentTimeMillis()); 22 | Thread.sleep(10000); 23 | } finally { 24 | lock.readLock().unlock(); 25 | } 26 | } catch (InterruptedException e) { 27 | e.printStackTrace(); 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example10/Service2.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.lock.example10; 2 | 3 | import java.util.concurrent.locks.ReentrantReadWriteLock; 4 | 5 | /** 6 | * Created by Brian on 2016/4/15. 7 | */ 8 | 9 | /** 10 | * TODO 11 | * 这里为什么用双try? 12 | * 以前不都是直接try catch finally的吗? 13 | */ 14 | public class Service2 { 15 | private ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); 16 | 17 | public void write() { 18 | try { 19 | try { 20 | lock.writeLock().lock(); 21 | System.out.println("获得写锁" + Thread.currentThread().getName() + " " + System.currentTimeMillis()); 22 | Thread.sleep(10000); 23 | } finally { 24 | lock.writeLock().unlock(); 25 | } 26 | } catch (InterruptedException e) { 27 | e.printStackTrace(); 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example2/Run2_MustUseMoreCondition.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.lock.example2; 2 | 3 | /** 4 | * Created by Brian on 2016/4/15. 5 | */ 6 | 7 | /** 8 | * P210 9 | * 使用多个condition实现通知部分线程 10 | */ 11 | public class Run2_MustUseMoreCondition { 12 | public static void main(String[] args) throws InterruptedException { 13 | MyService service = new MyService(); 14 | ThreadA a = new ThreadA(service); 15 | a.setName("A"); 16 | a.start(); 17 | ThreadB b = new ThreadB(service); 18 | b.setName("B"); 19 | b.start(); 20 | Thread.sleep(3000); 21 | service.signalAll_A(); 22 | } 23 | } 24 | 25 | 26 | /* 27 | 输出: 28 | awaitA begin时间为1460687242048 ThreadName=A 29 | awaitB begin时间为1460687242048 ThreadName=B 30 | signalAll_A 时间为1460687245048 ThreadName=main 31 | awaitA end 时间为1460687245048 ThreadName=A 32 | A锁释放了 时间为1460687245048 ThreadName=A 33 | */ -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example2/ThreadA.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.lock.example2; 2 | 3 | /** 4 | * Created by Brian on 2016/4/15. 5 | */ 6 | public class ThreadA extends Thread { 7 | private MyService service; 8 | 9 | public ThreadA(MyService service) { 10 | this.service = service; 11 | } 12 | 13 | @Override 14 | public void run() { 15 | service.awaitA(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example2/ThreadB.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.lock.example2; 2 | 3 | /** 4 | * Created by Brian on 2016/4/15. 5 | */ 6 | public class ThreadB extends Thread { 7 | private MyService service; 8 | 9 | public ThreadB(MyService service) { 10 | this.service = service; 11 | } 12 | 13 | @Override 14 | public void run() { 15 | service.awaitB(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example3/ThreadA.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.lock.example3; 2 | 3 | /** 4 | * Created by Brian on 2016/4/15. 5 | */ 6 | public class ThreadA extends Thread { 7 | private MyService service; 8 | 9 | public ThreadA(MyService service) { 10 | this.service = service; 11 | } 12 | 13 | @Override 14 | public void run() { 15 | for (int i = 0; i < Integer.MAX_VALUE; i++) { 16 | service.set(); 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example3/ThreadB.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.lock.example3; 2 | 3 | /** 4 | * Created by Brian on 2016/4/15. 5 | */ 6 | public class ThreadB extends Thread { 7 | private MyService service; 8 | 9 | public ThreadB(MyService service) { 10 | this.service = service; 11 | } 12 | 13 | @Override 14 | public void run() { 15 | for (int i = 0; i < Integer.MAX_VALUE; i++) { 16 | service.get(); 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example4/Service.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.lock.example4; 2 | 3 | import java.util.concurrent.locks.ReentrantLock; 4 | 5 | /** 6 | * Created by Brian on 2016/4/15. 7 | */ 8 | public class Service { 9 | private ReentrantLock lock; 10 | 11 | public Service(boolean isFair) { 12 | this.lock = new ReentrantLock(isFair); 13 | } 14 | 15 | public void serviceMethod() { 16 | try { 17 | lock.lock(); 18 | System.out.println("ThreadName=" + Thread.currentThread().getName() + "获得锁定"); 19 | } finally { 20 | lock.unlock(); 21 | } 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example5/Run5_getHoldCount.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.lock.example5; 2 | 3 | /** 4 | * Created by Brian on 2016/4/15. 5 | */ 6 | 7 | /** 8 | * P219 9 | * 测试方法int getHoldCount() 10 | * 查询当前线程保持此锁定的个数,即调用lock()方法的次数 11 | */ 12 | public class Run5_getHoldCount { 13 | public static void main(String[] args) { 14 | Service1 service = new Service1(); 15 | service.serviceMethod1(); 16 | } 17 | } 18 | 19 | 20 | /* 21 | 输出: 22 | serviceMethod1 getHoldCount=1 23 | serviceMethod2 getHoldCount=2 24 | */ -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example5/Service1.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.lock.example5; 2 | 3 | import java.util.concurrent.locks.ReentrantLock; 4 | 5 | /** 6 | * Created by Brian on 2016/4/15. 7 | */ 8 | public class Service1 { 9 | private ReentrantLock lock = new ReentrantLock(); 10 | 11 | public void serviceMethod1() { 12 | try { 13 | lock.lock(); 14 | System.out.println("serviceMethod1 getHoldCount=" + lock.getHoldCount()); 15 | serviceMethod2(); 16 | } finally { 17 | lock.unlock(); 18 | } 19 | } 20 | 21 | public void serviceMethod2() { 22 | try { 23 | lock.lock(); 24 | System.out.println("serviceMethod2 getHoldCount=" + lock.getHoldCount()); 25 | } finally { 26 | lock.unlock(); 27 | } 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example5/Service2.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.lock.example5; 2 | 3 | import java.util.concurrent.locks.ReentrantLock; 4 | 5 | /** 6 | * Created by Brian on 2016/4/15. 7 | */ 8 | public class Service2 { 9 | public ReentrantLock lock = new ReentrantLock(); 10 | 11 | public void serviceMethod1() { 12 | try { 13 | lock.lock(); 14 | System.out.println("ThreadName=" + Thread.currentThread().getName()); 15 | Thread.sleep(Integer.MAX_VALUE); 16 | } catch (InterruptedException e) { 17 | e.printStackTrace(); 18 | } finally { 19 | lock.unlock(); 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example6/Service1.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.lock.example6; 2 | 3 | import java.util.concurrent.locks.Condition; 4 | import java.util.concurrent.locks.ReentrantLock; 5 | 6 | /** 7 | * Created by Brian on 2016/4/15. 8 | */ 9 | public class Service1 { 10 | public ReentrantLock lock = new ReentrantLock(); 11 | public Condition newCondition = lock.newCondition(); 12 | 13 | public void waitMethod() { 14 | try { 15 | lock.lock(); 16 | Thread.sleep(Integer.MAX_VALUE); 17 | } catch (InterruptedException e) { 18 | e.printStackTrace(); 19 | } finally { 20 | lock.unlock(); 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example7/Run7_isFair.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.lock.example7; 2 | 3 | /** 4 | * Created by Brian on 2016/4/15. 5 | */ 6 | 7 | /** 8 | * P224 9 | * 测试方法boolean isFair() 10 | * 判断是不是公平锁 11 | */ 12 | public class Run7_isFair { 13 | public static void main(String[] args) { 14 | final Service1 service = new Service1(true); 15 | Runnable runnable = new Runnable() { 16 | public void run() { 17 | service.serviceMethod(); 18 | } 19 | }; 20 | Thread thread = new Thread(runnable); 21 | thread.start(); 22 | final Service1 service2 = new Service1(false); 23 | runnable = new Runnable() { 24 | public void run() { 25 | service2.serviceMethod(); 26 | } 27 | }; 28 | thread = new Thread(runnable); 29 | thread.start(); 30 | 31 | } 32 | } 33 | 34 | /* 35 | 输出: 36 | 公平锁情况:true 37 | 公平锁情况:false 38 | */ -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example7/Run7_isHeldByCurrentThread.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.lock.example7; 2 | 3 | /** 4 | * Created by Brian on 2016/4/15. 5 | */ 6 | 7 | /** 8 | * P225 9 | * 测试方法boolean isHeldByCurrentThread() 10 | * 查询当前线程是否保持此锁定 11 | */ 12 | public class Run7_isHeldByCurrentThread { 13 | public static void main(String[] args) { 14 | final Service2 service = new Service2(true); 15 | Runnable runnable = new Runnable() { 16 | public void run() { 17 | service.serviceMethod(); 18 | } 19 | }; 20 | Thread thread = new Thread(runnable); 21 | thread.start(); 22 | } 23 | } 24 | 25 | 26 | /* 27 | 输出: 28 | false 29 | true 30 | */ -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example7/Run7_isLocked.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.lock.example7; 2 | 3 | /** 4 | * Created by Brian on 2016/4/15. 5 | */ 6 | 7 | /** 8 | * P226 9 | * 测试方法boolean isLocked() 10 | * 查询此锁定是否由任意线程保持 11 | */ 12 | public class Run7_isLocked { 13 | public static void main(String[] args) { 14 | final Service3 service = new Service3(true); 15 | Runnable runnable = new Runnable() { 16 | public void run() { 17 | service.serviceMethod(); 18 | } 19 | }; 20 | 21 | Thread thread = new Thread(runnable); 22 | thread.start(); 23 | } 24 | } 25 | 26 | 27 | /* 28 | 输出: 29 | false 30 | true 31 | */ -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example7/Service1.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.lock.example7; 2 | 3 | import java.util.concurrent.locks.ReentrantLock; 4 | 5 | /** 6 | * Created by Brian on 2016/4/15. 7 | */ 8 | public class Service1 { 9 | private ReentrantLock lock; 10 | 11 | public Service1(boolean isFair) { 12 | lock = new ReentrantLock(isFair); 13 | } 14 | 15 | public void serviceMethod() { 16 | try { 17 | lock.lock(); 18 | System.out.println("公平锁情况:" + lock.isFair()); 19 | } finally { 20 | lock.unlock(); 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example7/Service2.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.lock.example7; 2 | 3 | import java.util.concurrent.locks.ReentrantLock; 4 | 5 | /** 6 | * Created by Brian on 2016/4/15. 7 | */ 8 | public class Service2 { 9 | private ReentrantLock lock; 10 | 11 | public Service2(boolean isFair) { 12 | lock = new ReentrantLock(isFair); 13 | } 14 | 15 | public void serviceMethod() { 16 | try { 17 | System.out.println(lock.isHeldByCurrentThread()); 18 | lock.lock(); 19 | System.out.println(lock.isHeldByCurrentThread()); 20 | } finally { 21 | lock.unlock(); 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example7/Service3.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.lock.example7; 2 | 3 | import java.util.concurrent.locks.ReentrantLock; 4 | 5 | /** 6 | * Created by Brian on 2016/4/15. 7 | */ 8 | public class Service3 { 9 | private ReentrantLock lock; 10 | 11 | public Service3(boolean isFair) { 12 | lock = new ReentrantLock(isFair); 13 | } 14 | 15 | public void serviceMethod() { 16 | try { 17 | System.out.println(lock.isLocked()); 18 | lock.lock(); 19 | System.out.println(lock.isLocked()); 20 | } finally { 21 | lock.unlock(); 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example8/Run8_tryLock.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.lock.example8; 2 | 3 | /** 4 | * Created by Brian on 2016/4/15. 5 | */ 6 | 7 | /** 8 | * P228 9 | * 测试方法boolean tryLock() 10 | * 仅在调用时锁定未被另一个线程保持的情况下,才获取该锁定 11 | */ 12 | public class Run8_tryLock { 13 | public static void main(String[] args) { 14 | final Service3 service = new Service3(); 15 | Runnable runnable = new Runnable() { 16 | public void run() { 17 | service.waitMethod(); 18 | } 19 | }; 20 | 21 | Thread threadA = new Thread(runnable); 22 | threadA.setName("A"); 23 | threadA.start(); 24 | 25 | Thread threadB = new Thread(runnable); 26 | threadB.setName("B"); 27 | threadB.start(); 28 | } 29 | } 30 | 31 | /* 32 | 输出: 33 | B获得锁 34 | A没有获得锁 35 | 36 | ------------------ 37 | 38 | A获得锁 39 | B没有获得锁 40 | */ -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example8/Service1.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.lock.example8; 2 | 3 | import java.util.concurrent.locks.Condition; 4 | import java.util.concurrent.locks.ReentrantLock; 5 | 6 | /** 7 | * Created by Brian on 2016/4/15. 8 | */ 9 | public class Service1 { 10 | public ReentrantLock lock = new ReentrantLock(); 11 | private Condition condition = lock.newCondition(); 12 | 13 | public void waitMethod() { 14 | try { 15 | lock.lock(); 16 | System.out.println("lock begin " + Thread.currentThread().getName()); 17 | for (int i = 0; i < Integer.MAX_VALUE / 10; i++) { 18 | String s = new String(); 19 | Math.random(); 20 | } 21 | System.out.println("lock end " + Thread.currentThread().getName()); 22 | } finally { 23 | if (lock.isHeldByCurrentThread()) { 24 | lock.unlock(); 25 | } 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example8/Service3.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.lock.example8; 2 | 3 | import java.util.concurrent.locks.ReentrantLock; 4 | 5 | /** 6 | * Created by Brian on 2016/4/15. 7 | */ 8 | public class Service3 { 9 | public ReentrantLock lock = new ReentrantLock(); 10 | 11 | public void waitMethod() { 12 | if (lock.tryLock()) { 13 | System.out.println(Thread.currentThread().getName() + "获得锁"); 14 | } else { 15 | System.out.println(Thread.currentThread().getName() + "没有获得锁"); 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example8/Service4.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.lock.example8; 2 | 3 | import java.util.concurrent.TimeUnit; 4 | import java.util.concurrent.locks.ReentrantLock; 5 | 6 | /** 7 | * Created by Brian on 2016/4/15. 8 | */ 9 | public class Service4 { 10 | public ReentrantLock lock = new ReentrantLock(); 11 | 12 | public void waitMethod() { 13 | try { 14 | if (lock.tryLock(3, TimeUnit.SECONDS)) { 15 | System.out.println(Thread.currentThread().getName() + "获得锁的时间:" + System.currentTimeMillis()); 16 | Thread.sleep(10000); 17 | } else { 18 | System.out.println(Thread.currentThread().getName() + "没有获得锁"); 19 | } 20 | } catch (InterruptedException e) { 21 | e.printStackTrace(); 22 | } finally { 23 | if (lock.isHeldByCurrentThread()) { 24 | lock.unlock(); 25 | } 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example9/Run9_awaitUniterruptibly2.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.lock.example9; 2 | 3 | /** 4 | * Created by Brian on 2016/4/15. 5 | */ 6 | 7 | /** 8 | * P232 9 | * 测试方法awaitUniterruptibly() 10 | */ 11 | public class Run9_awaitUniterruptibly2 { 12 | public static void main(String[] args) { 13 | try { 14 | Service2 service = new Service2(); 15 | Thread2 thread = new Thread2(service); 16 | thread.start(); 17 | Thread.sleep(3000); 18 | thread.interrupt(); 19 | } catch (InterruptedException e) { 20 | e.printStackTrace(); 21 | } 22 | } 23 | } 24 | 25 | /* 26 | 输出: 27 | wait begin 28 | 29 | */ -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example9/Run9_awaitUntil1.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.lock.example9; 2 | 3 | /** 4 | * Created by Brian on 2016/4/15. 5 | */ 6 | 7 | /** 8 | * P233 9 | * 测试方法awaitUntil() 10 | * 到达等待时间可唤醒自己 11 | */ 12 | public class Run9_awaitUntil1 { 13 | public static void main(String[] args) { 14 | Service service = new Service(); 15 | ThreadA threadA = new ThreadA(service); 16 | threadA.start(); 17 | } 18 | } 19 | 20 | 21 | /* 22 | 输出: 23 | wait begin timer=1460724068711 24 | wait end timer=1460724078704 25 | */ -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example9/Run9_awaitUntil2.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.lock.example9; 2 | 3 | /** 4 | * Created by Brian on 2016/4/15. 5 | */ 6 | 7 | /** 8 | * P233 9 | * 测试方法awaitUntil() 10 | * 线程在等待时间到达前,可以被其他线程唤醒 11 | */ 12 | public class Run9_awaitUntil2 { 13 | public static void main(String[] args) throws InterruptedException { 14 | Service service = new Service(); 15 | ThreadA threadA = new ThreadA(service); 16 | threadA.start(); 17 | Thread.sleep(2000); 18 | ThreadB threadB = new ThreadB(service); 19 | threadB.start(); 20 | } 21 | } 22 | 23 | 24 | /* 25 | 输出: 26 | wait begin timer=1460724153513 27 | notify begin timer=1460724155507 28 | notify end timer=1460724155507 29 | wait end timer=1460724155508 30 | */ -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example9/Service1.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.lock.example9; 2 | 3 | import java.util.concurrent.locks.Condition; 4 | import java.util.concurrent.locks.ReentrantLock; 5 | 6 | /** 7 | * Created by Brian on 2016/4/15. 8 | */ 9 | public class Service1 { 10 | private ReentrantLock lock = new ReentrantLock(); 11 | private Condition condition = lock.newCondition(); 12 | 13 | public void testMethod() { 14 | try { 15 | lock.lock(); 16 | System.out.println("wait begin"); 17 | condition.await(); 18 | System.out.println("wait end"); 19 | } catch (InterruptedException e) { 20 | e.printStackTrace(); 21 | System.out.println("catch"); 22 | } finally { 23 | lock.unlock(); 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example9/Service2.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.lock.example9; 2 | 3 | import java.util.concurrent.locks.Condition; 4 | import java.util.concurrent.locks.ReentrantLock; 5 | 6 | /** 7 | * Created by Brian on 2016/4/15. 8 | */ 9 | public class Service2 { 10 | private ReentrantLock lock = new ReentrantLock(); 11 | private Condition condition = lock.newCondition(); 12 | 13 | public void testMethod() { 14 | try { 15 | lock.lock(); 16 | System.out.println("wait begin"); 17 | condition.awaitUninterruptibly(); 18 | System.out.println("wait end"); 19 | } finally { 20 | lock.unlock(); 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example9/Thread1.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.lock.example9; 2 | 3 | /** 4 | * Created by Brian on 2016/4/15. 5 | */ 6 | public class Thread1 extends Thread { 7 | private Service1 service; 8 | 9 | public Thread1(Service1 service) { 10 | this.service = service; 11 | } 12 | 13 | @Override 14 | public void run() { 15 | service.testMethod(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example9/Thread2.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.lock.example9; 2 | 3 | /** 4 | * Created by Brian on 2016/4/15. 5 | */ 6 | public class Thread2 extends Thread { 7 | private Service2 service; 8 | 9 | public Thread2(Service2 service) { 10 | this.service = service; 11 | } 12 | 13 | @Override 14 | public void run() { 15 | service.testMethod(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example9/ThreadA.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.lock.example9; 2 | 3 | /** 4 | * Created by Brian on 2016/4/15. 5 | */ 6 | public class ThreadA extends Thread { 7 | private Service service; 8 | 9 | public ThreadA(Service service) { 10 | this.service = service; 11 | } 12 | 13 | @Override 14 | public void run() { 15 | service.waitMethod(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example9/ThreadB.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.lock.example9; 2 | 3 | /** 4 | * Created by Brian on 2016/4/15. 5 | */ 6 | public class ThreadB extends Thread { 7 | private Service service; 8 | 9 | public ThreadB(Service service) { 10 | this.service = service; 11 | } 12 | 13 | @Override 14 | public void run() { 15 | service.notifyMethod(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run16_yield.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.meet; 2 | 3 | /** 4 | * Created by Brian on 2016/4/11. 5 | */ 6 | 7 | /** 8 | * P42例子 9 | * 测试yield 10 | */ 11 | 12 | class MyThread16 extends Thread { 13 | @Override 14 | public void run() { 15 | long beginTime = System.currentTimeMillis(); 16 | int count = 0; 17 | for (int i = 0; i < 50000000; i++) { 18 | Thread.yield(); 19 | count = count + (i + 1); 20 | } 21 | long endTime = System.currentTimeMillis(); 22 | System.out.println("用时:" + (endTime - beginTime) + "毫秒"); 23 | } 24 | } 25 | 26 | public class Run16_yield { 27 | public static void main(String[] args) { 28 | MyThread16 myThread16 = new MyThread16(); 29 | myThread16.start(); 30 | } 31 | } 32 | 33 | 34 | /* 35 | //Thread.yield(); 36 | 输出: 37 | 用时:2毫秒 38 | 39 | ----------------- 40 | 41 | Thread.yield(); 42 | 输出: 43 | 用时:3302毫秒 44 | 45 | */ -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run4_isAlive01.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.meet; 2 | 3 | /** 4 | * Created by brian on 2016/4/11. 5 | */ 6 | 7 | /** 8 | * P18 9 | * isAlive() 10 | */ 11 | class MyThread4 extends Thread { 12 | @Override 13 | public void run() { 14 | System.out.println("run=" + this.isAlive()); 15 | } 16 | } 17 | 18 | public class Run4_isAlive01 { 19 | public static void main(String[] args) throws InterruptedException { 20 | MyThread4 myThread4 = new MyThread4(); 21 | System.out.println("begin == " + myThread4.isAlive()); 22 | myThread4.start(); 23 | //Thread.sleep(1000); 24 | System.out.println("end == " + myThread4.isAlive()); 25 | } 26 | 27 | } 28 | 29 | /* 30 | 输出: 31 | begin == false 32 | end == true 33 | run=true 34 | 35 | -------------- 36 | Thread.sleep(1000); 37 | 38 | 输出: 39 | begin == false 40 | run=true 41 | end == false 42 | 43 | */ 44 | 45 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run7_interrupt01.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.meet; 2 | 3 | /** 4 | * Created by brian on 2016/4/11. 5 | */ 6 | 7 | /** 8 | * P23 9 | * 停止线程 10 | */ 11 | 12 | class MyThread7 extends Thread { 13 | @Override 14 | public void run() { 15 | super.run(); 16 | for (int i = 0; i < 500000; i++) { 17 | System.out.println("i=" + (i + 1)); 18 | } 19 | } 20 | } 21 | 22 | public class Run7_interrupt01 { 23 | public static void main(String[] args) { 24 | try { 25 | MyThread7 myThread7 = new MyThread7(); 26 | myThread7.start(); 27 | Thread.sleep(1000); 28 | myThread7.interrupt(); 29 | } catch (InterruptedException e) { 30 | System.out.println("main catch"); 31 | e.printStackTrace(); 32 | } 33 | 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run9_interrupted02.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.meet; 2 | 3 | /** 4 | * Created by brian on 2016/4/11. 5 | */ 6 | 7 | /** 8 | * P26例子 9 | * 线程的中断状态由interrupted()清除 10 | */ 11 | public class Run9_interrupted02 { 12 | public static void main(String[] args) { 13 | Thread.currentThread().interrupt(); 14 | System.out.println("Thread.interrupted(),是否停止1?=" + Thread.interrupted()); 15 | System.out.println("Thread.interrupted(),是否停止2?=" + Thread.interrupted()); 16 | System.out.println("end"); 17 | } 18 | } 19 | 20 | /* 21 | 输出: 22 | Thread.interrupted(),是否停止1?=true 23 | Thread.interrupted(),是否停止2?=false 24 | end 25 | 26 | */ -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/printMain.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.meet; 2 | 3 | /** 4 | * Created by Brian on 2016/4/10. 5 | */ 6 | 7 | /** 8 | * P4的小例子 9 | */ 10 | public class printMain { 11 | public static void main(String[] args) { 12 | System.out.println(Thread.currentThread().getName()); 13 | } 14 | } 15 | 16 | /* 17 | output: 18 | main 19 | */ -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example1/MyObject0.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.singleton.example1; 2 | 3 | /** 4 | * Created by Brian on 2016/4/16. 5 | */ 6 | 7 | /** 8 | * 缺点:不能有其他实例变量 9 | * getInstance()方法没有同步,可能出现非线程安全问题 10 | */ 11 | public class MyObject0 { 12 | private static MyObject0 myObject = new MyObject0(); 13 | 14 | private MyObject0() { 15 | } 16 | 17 | public static MyObject0 getInstance() { 18 | return myObject; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example1/MyObject1.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.singleton.example1; 2 | 3 | /** 4 | * Created by Brian on 2016/4/16. 5 | */ 6 | public class MyObject1 { 7 | private static MyObject1 myObject; 8 | 9 | private MyObject1() { 10 | } 11 | 12 | public static MyObject1 getInstance() { 13 | //延迟加载 14 | if (myObject == null) { 15 | myObject = new MyObject1(); 16 | } 17 | return myObject; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example1/MyObject2.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.singleton.example1; 2 | 3 | /** 4 | * Created by Brian on 2016/4/16. 5 | */ 6 | public class MyObject2 { 7 | private static MyObject2 myObject; 8 | 9 | private MyObject2() { 10 | } 11 | 12 | public static MyObject2 getInstance() { 13 | 14 | try { 15 | if (myObject == null) { 16 | Thread.sleep(2000);//模拟创建对象前的坐一些准备 17 | myObject = new MyObject2(); 18 | } 19 | } catch (InterruptedException e) { 20 | e.printStackTrace(); 21 | } 22 | return myObject; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example1/Run1_singleton0.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.singleton.example1; 2 | 3 | /** 4 | * Created by Brian on 2016/4/16. 5 | */ 6 | 7 | /** 8 | * p262 9 | * 立即加载/“饿汉模式” 10 | */ 11 | public class Run1_singleton0 { 12 | public static void main(String[] args) { 13 | Thread0 t1 = new Thread0(); 14 | Thread0 t2 = new Thread0(); 15 | Thread0 t3 = new Thread0(); 16 | t1.start(); 17 | t2.start(); 18 | t3.start(); 19 | } 20 | } 21 | 22 | 23 | /* 24 | 输出: 25 | 663838472 com.brianway.learning.java.multithread.singleton.example1.MyObject0@27915f08 26 | 663838472 com.brianway.learning.java.multithread.singleton.example1.MyObject0@27915f08 27 | 663838472 com.brianway.learning.java.multithread.singleton.example1.MyObject0@27915f08 28 | */ -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example1/Run1_singleton2.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.singleton.example1; 2 | 3 | /** 4 | * Created by Brian on 2016/4/16. 5 | */ 6 | 7 | /** 8 | * p265 9 | * 延迟加载/“懒汉模式”缺点展示 10 | */ 11 | public class Run1_singleton2 { 12 | public static void main(String[] args) { 13 | Thread2 t1 = new Thread2(); 14 | Thread2 t2 = new Thread2(); 15 | Thread2 t3 = new Thread2(); 16 | t1.start(); 17 | t2.start(); 18 | t3.start(); 19 | } 20 | } 21 | 22 | 23 | /* 24 | 输出: 25 | 1771081048 com.brianway.learning.java.multithread.singleton.example1.MyObject2@6b75f40e 26 | 1802892302 com.brianway.learning.java.multithread.singleton.example1.MyObject2@6b75f40e 27 | 974814630 com.brianway.learning.java.multithread.singleton.example1.MyObject2@6b75f40e 28 | 29 | */ -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example1/Thread0.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.singleton.example1; 2 | 3 | /** 4 | * Created by Brian on 2016/4/16. 5 | */ 6 | public class Thread0 extends Thread { 7 | @Override 8 | public void run() { 9 | System.out.println(MyObject0.getInstance().hashCode() + " " + MyObject0.getInstance()); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example1/Thread1.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.singleton.example1; 2 | 3 | /** 4 | * Created by Brian on 2016/4/16. 5 | */ 6 | public class Thread1 extends Thread { 7 | @Override 8 | public void run() { 9 | System.out.println(MyObject1.getInstance().hashCode() + " " + MyObject1.getInstance()); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example1/Thread2.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.singleton.example1; 2 | 3 | /** 4 | * Created by Brian on 2016/4/16. 5 | */ 6 | public class Thread2 extends Thread { 7 | @Override 8 | public void run() { 9 | System.out.println(MyObject2.getInstance().hashCode() + " " + MyObject2.getInstance()); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/MyObject1.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.singleton.example2; 2 | 3 | /** 4 | * Created by Brian on 2016/4/16. 5 | */ 6 | public class MyObject1 { 7 | private static MyObject1 myObject; 8 | 9 | private MyObject1() { 10 | } 11 | 12 | synchronized public static MyObject1 getInstance() { 13 | 14 | try { 15 | if (myObject == null) { 16 | Thread.sleep(3000);//模拟创建对象前的坐一些准备 17 | myObject = new MyObject1(); 18 | } 19 | } catch (InterruptedException e) { 20 | e.printStackTrace(); 21 | } 22 | return myObject; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/MyObject2.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.singleton.example2; 2 | 3 | /** 4 | * Created by Brian on 2016/4/16. 5 | */ 6 | public class MyObject2 { 7 | private static MyObject2 myObject; 8 | 9 | private MyObject2() { 10 | } 11 | 12 | public static MyObject2 getInstance() { 13 | 14 | try { 15 | //此写法和方法前加synchronized一样效率低下,全部代码被上锁 16 | synchronized (MyObject2.class) { 17 | if (myObject == null) { 18 | Thread.sleep(3000);//模拟创建对象前的坐一些准备 19 | myObject = new MyObject2(); 20 | } 21 | } 22 | } catch (InterruptedException e) { 23 | e.printStackTrace(); 24 | } 25 | return myObject; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/MyObject3.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.singleton.example2; 2 | 3 | /** 4 | * Created by Brian on 2016/4/16. 5 | */ 6 | public class MyObject3 { 7 | private static MyObject3 myObject; 8 | 9 | private MyObject3() { 10 | } 11 | 12 | public static MyObject3 getInstance() { 13 | 14 | try { 15 | if (myObject == null) { 16 | Thread.sleep(3000);//模拟创建对象前的坐一些准备 17 | //虽然部分代码被上锁,但还是有非线程安全问题 18 | synchronized (MyObject3.class) { 19 | myObject = new MyObject3(); 20 | } 21 | } 22 | } catch (InterruptedException e) { 23 | e.printStackTrace(); 24 | } 25 | return myObject; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/MyObject4.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.singleton.example2; 2 | 3 | /** 4 | * Created by Brian on 2016/4/16. 5 | */ 6 | public class MyObject4 { 7 | private static MyObject4 myObject; 8 | 9 | private MyObject4() { 10 | } 11 | 12 | public static MyObject4 getInstance() { 13 | //双检查锁机制 14 | try { 15 | if (myObject == null) { 16 | Thread.sleep(3000);//模拟创建对象前的坐一些准备 17 | synchronized (MyObject4.class) { 18 | if (myObject == null) { 19 | myObject = new MyObject4(); 20 | } 21 | } 22 | } 23 | } catch (InterruptedException e) { 24 | e.printStackTrace(); 25 | } 26 | return myObject; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/Run2_singleton1.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.singleton.example2; 2 | 3 | /** 4 | * Created by Brian on 2016/4/16. 5 | */ 6 | 7 | /** 8 | * p266 9 | * 延迟加载/“懒汉模式”解决方案 10 | * 声明synchronized关键字,整个方法上锁 11 | * 效率低下,下一个线程想取得对象,须等上一个线程释放锁 12 | */ 13 | public class Run2_singleton1 { 14 | public static void main(String[] args) { 15 | Thread1 t1 = new Thread1(); 16 | Thread1 t2 = new Thread1(); 17 | Thread1 t3 = new Thread1(); 18 | t1.start(); 19 | t2.start(); 20 | t3.start(); 21 | } 22 | } 23 | 24 | 25 | /* 26 | 输出: 27 | 872395065 com.brianway.learning.java.multithread.singleton.example2.MyObject1@33ffb139 28 | 872395065 com.brianway.learning.java.multithread.singleton.example2.MyObject1@33ffb139 29 | 872395065 com.brianway.learning.java.multithread.singleton.example2.MyObject1@33ffb139 30 | 31 | 32 | */ -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/Run2_singleton2.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.singleton.example2; 2 | 3 | /** 4 | * Created by Brian on 2016/4/16. 5 | */ 6 | 7 | /** 8 | * p267 9 | * 延迟加载/“懒汉模式”解决方案 10 | * 声明synchronized关键字,同步代码块 11 | * 效率低下 12 | */ 13 | public class Run2_singleton2 { 14 | public static void main(String[] args) { 15 | Thread2 t1 = new Thread2(); 16 | Thread2 t2 = new Thread2(); 17 | Thread2 t3 = new Thread2(); 18 | t1.start(); 19 | t2.start(); 20 | t3.start(); 21 | } 22 | } 23 | 24 | 25 | /* 26 | 输出: 27 | 974814630 com.brianway.learning.java.multithread.singleton.example2.MyObject2@3a1a7da6 28 | 974814630 com.brianway.learning.java.multithread.singleton.example2.MyObject2@3a1a7da6 29 | 974814630 com.brianway.learning.java.multithread.singleton.example2.MyObject2@3a1a7da6 30 | */ -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/Run2_singleton3.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.singleton.example2; 2 | 3 | /** 4 | * Created by Brian on 2016/4/16. 5 | */ 6 | 7 | /** 8 | * p269 9 | * 延迟加载/“懒汉模式”解决方案 10 | * 声明synchronized关键字,部分代码上锁 11 | * 会出问题 12 | */ 13 | public class Run2_singleton3 { 14 | public static void main(String[] args) { 15 | Thread3 t1 = new Thread3(); 16 | Thread3 t2 = new Thread3(); 17 | Thread3 t3 = new Thread3(); 18 | t1.start(); 19 | t2.start(); 20 | t3.start(); 21 | } 22 | } 23 | 24 | 25 | /* 26 | 输出: 27 | 541962297 com.brianway.learning.java.multithread.singleton.example2.MyObject3@3b162ba 28 | 974814630 com.brianway.learning.java.multithread.singleton.example2.MyObject3@3b162ba 29 | 61956794 com.brianway.learning.java.multithread.singleton.example2.MyObject3@3b162ba 30 | */ -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/Run2_singleton4.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.singleton.example2; 2 | 3 | /** 4 | * Created by Brian on 2016/4/16. 5 | */ 6 | 7 | /** 8 | * p270 9 | * 延迟加载/“懒汉模式”解决方案 10 | * DCL双检查锁机制 11 | */ 12 | public class Run2_singleton4 { 13 | public static void main(String[] args) { 14 | Thread4 t1 = new Thread4(); 15 | Thread4 t2 = new Thread4(); 16 | Thread4 t3 = new Thread4(); 17 | t1.start(); 18 | t2.start(); 19 | t3.start(); 20 | } 21 | } 22 | 23 | 24 | /* 25 | 输出: 26 | 2110701623 com.brianway.learning.java.multithread.singleton.example2.MyObject4@7dcec037 27 | 2110701623 com.brianway.learning.java.multithread.singleton.example2.MyObject4@7dcec037 28 | 2110701623 com.brianway.learning.java.multithread.singleton.example2.MyObject4@7dcec037 29 | */ -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/Thread1.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.singleton.example2; 2 | 3 | /** 4 | * Created by Brian on 2016/4/16. 5 | */ 6 | public class Thread1 extends Thread { 7 | @Override 8 | public void run() { 9 | System.out.println(MyObject1.getInstance().hashCode() + " " + MyObject1.getInstance()); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/Thread2.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.singleton.example2; 2 | 3 | /** 4 | * Created by Brian on 2016/4/16. 5 | */ 6 | public class Thread2 extends Thread { 7 | @Override 8 | public void run() { 9 | System.out.println(MyObject2.getInstance().hashCode() + " " + MyObject2.getInstance()); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/Thread3.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.singleton.example2; 2 | 3 | /** 4 | * Created by Brian on 2016/4/16. 5 | */ 6 | public class Thread3 extends Thread { 7 | @Override 8 | public void run() { 9 | System.out.println(MyObject3.getInstance().hashCode() + " " + MyObject3.getInstance()); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/Thread4.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.singleton.example2; 2 | 3 | /** 4 | * Created by Brian on 2016/4/16. 5 | */ 6 | public class Thread4 extends Thread { 7 | @Override 8 | public void run() { 9 | System.out.println(MyObject4.getInstance().hashCode() + " " + MyObject4.getInstance()); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/MyObject1.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.singleton.example3; 2 | 3 | /** 4 | * Created by Brian on 2016/4/16. 5 | */ 6 | public class MyObject1 { 7 | private static class MyObjectHandler { 8 | private static MyObject1 myObject = new MyObject1(); 9 | } 10 | 11 | private MyObject1() { 12 | } 13 | 14 | synchronized public static MyObject1 getInstance() { 15 | return MyObjectHandler.myObject; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/MyObject2.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.singleton.example3; 2 | 3 | import java.io.Serializable; 4 | 5 | /** 6 | * Created by Brian on 2016/4/16. 7 | */ 8 | public class MyObject2 implements Serializable { 9 | private static class MyObjectHandler { 10 | private static final MyObject2 myObject = new MyObject2(); 11 | } 12 | 13 | private MyObject2() { 14 | } 15 | 16 | synchronized public static MyObject2 getInstance() { 17 | return MyObjectHandler.myObject; 18 | } 19 | 20 | protected Object readResolve() { 21 | System.out.println("调用了readResolve方法"); 22 | return MyObjectHandler.myObject; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/MyObject3.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.singleton.example3; 2 | 3 | /** 4 | * Created by Brian on 2016/4/16. 5 | */ 6 | public class MyObject3 { 7 | 8 | private static MyObject3 instance = null; 9 | 10 | private MyObject3() { 11 | } 12 | 13 | static { 14 | instance = new MyObject3(); 15 | } 16 | 17 | public static MyObject3 getInstance() { 18 | return instance; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/MyObject4.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.singleton.example3; 2 | 3 | /** 4 | * Created by Brian on 2016/4/16. 5 | */ 6 | public enum MyObject4 { 7 | ObjectFactory; 8 | private Object object; 9 | 10 | private MyObject4() { 11 | try { 12 | Thread.sleep(3000);//模拟初始化 13 | object = new Object(); 14 | } catch (InterruptedException e) { 15 | e.printStackTrace(); 16 | } 17 | } 18 | 19 | public Object getObject() { 20 | return object; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/MyObject5.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.singleton.example3; 2 | 3 | /** 4 | * Created by Brian on 2016/4/16. 5 | */ 6 | public class MyObject5 { 7 | public enum MyEnumSingleton { 8 | ObjectFactory; 9 | private Object object; 10 | 11 | private MyEnumSingleton() { 12 | try { 13 | Thread.sleep(3000);//模拟初始化 14 | object = new Object(); 15 | } catch (InterruptedException e) { 16 | e.printStackTrace(); 17 | } 18 | } 19 | 20 | public Object getObject() { 21 | return object; 22 | } 23 | } 24 | 25 | public static Object getObject() { 26 | return MyEnumSingleton.ObjectFactory.getObject(); 27 | } 28 | 29 | } 30 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/Run3_singleton1.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.singleton.example3; 2 | 3 | /** 4 | * Created by Brian on 2016/4/16. 5 | */ 6 | 7 | /** 8 | * p272 9 | * 使用静态内置类实现单例模式 10 | */ 11 | public class Run3_singleton1 { 12 | public static void main(String[] args) { 13 | Thread1 t1 = new Thread1(); 14 | Thread1 t2 = new Thread1(); 15 | Thread1 t3 = new Thread1(); 16 | t1.start(); 17 | t2.start(); 18 | t3.start(); 19 | } 20 | } 21 | 22 | 23 | /* 24 | 输出: 25 | 418579292 com.brianway.learning.java.multithread.singleton.example3.MyObject1@18f3035c 26 | 418579292 com.brianway.learning.java.multithread.singleton.example3.MyObject1@18f3035c 27 | 418579292 com.brianway.learning.java.multithread.singleton.example3.MyObject1@18f3035c 28 | */ -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/Thread1.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.singleton.example3; 2 | 3 | /** 4 | * Created by Brian on 2016/4/16. 5 | */ 6 | public class Thread1 extends Thread { 7 | @Override 8 | public void run() { 9 | System.out.println(MyObject1.getInstance().hashCode() + " " + MyObject1.getInstance()); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/Thread3.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.singleton.example3; 2 | 3 | /** 4 | * Created by Brian on 2016/4/16. 5 | */ 6 | public class Thread3 extends Thread { 7 | @Override 8 | public void run() { 9 | for (int i = 0; i < 5; i++) { 10 | System.out.println(MyObject3.getInstance().hashCode() + " " + MyObject3.getInstance()); 11 | } 12 | 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/Thread4.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.singleton.example3; 2 | 3 | /** 4 | * Created by Brian on 2016/4/16. 5 | */ 6 | public class Thread4 extends Thread { 7 | @Override 8 | public void run() { 9 | for (int i = 0; i < 5; i++) { 10 | System.out.println(MyObject4.ObjectFactory.getObject().hashCode() + " " + MyObject4.ObjectFactory.getObject()); 11 | } 12 | 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/Thread5.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.singleton.example3; 2 | 3 | /** 4 | * Created by Brian on 2016/4/16. 5 | */ 6 | public class Thread5 extends Thread { 7 | @Override 8 | public void run() { 9 | for (int i = 0; i < 5; i++) { 10 | System.out.println(MyObject5.getObject().hashCode() + " " + MyObject5.getObject()); 11 | } 12 | 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example1/MyService.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.supplement.example1; 2 | 3 | /** 4 | * Created by Brian on 2016/4/17. 5 | */ 6 | public class MyService { 7 | synchronized static public void serviveMethod() { 8 | try { 9 | System.out.println(Thread.currentThread().getName() + " 进入了业务方法"); 10 | Thread.sleep(10000); 11 | } catch (InterruptedException e) { 12 | e.printStackTrace(); 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example1/Run1_state2.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.supplement.example1; 2 | 3 | /** 4 | * Created by Brian on 2016/4/17. 5 | */ 6 | 7 | /** 8 | * P282 9 | * 验证TIMED_WAITING 10 | */ 11 | public class Run1_state2 { 12 | public static void main(String[] args) { 13 | try { 14 | Thread2 t = new Thread2(); 15 | t.start(); 16 | Thread.sleep(1000); 17 | System.out.println("main方法中的状态:" + t.getState() + " of " + t.getName()); 18 | } catch (InterruptedException e) { 19 | e.printStackTrace(); 20 | } 21 | } 22 | } 23 | 24 | 25 | /* 26 | 输出: 27 | begin sleep,run方法中的状态:RUNNABLE of Thread-0 28 | begin sleep,run方法中的状态:RUNNABLE of Thread-0 29 | main方法中的状态:TIMED_WAITING of Thread-0 30 | end sleep,run方法中的状态:RUNNABLE of Thread-0 31 | end sleep,run方法中的状态:RUNNABLE of Thread-0 32 | */ -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example1/Run1_state3.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.supplement.example1; 2 | 3 | /** 4 | * Created by Brian on 2016/4/17. 5 | */ 6 | 7 | /** 8 | * P283 9 | * 验证BLOCKED 10 | */ 11 | public class Run1_state3 { 12 | public static void main(String[] args) { 13 | try { 14 | Thread3 t1 = new Thread3(); 15 | t1.setName("a"); 16 | t1.start(); 17 | Thread3 t2 = new Thread3(); 18 | t2.setName("b"); 19 | t2.start(); 20 | Thread.sleep(1000); 21 | System.out.println("main方法中的t2状态:" + t2.getState()); 22 | } catch (InterruptedException e) { 23 | e.printStackTrace(); 24 | } 25 | 26 | } 27 | } 28 | 29 | 30 | /* 31 | 输出: 32 | a 进入了业务方法 33 | main方法中的t2状态:BLOCKED 34 | b 进入了业务方法 35 | */ -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example1/Thread1.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.supplement.example1; 2 | 3 | /** 4 | * Created by Brian on 2016/4/17. 5 | */ 6 | public class Thread1 extends Thread { 7 | public Thread1() { 8 | System.out.println("构造方法中的状态:" + this.getState() + " of " + this.getName()); 9 | System.out.println("构造方法中的状态:" + Thread.currentThread().getState() + " of " + Thread.currentThread().getName()); 10 | } 11 | 12 | @Override 13 | public void run() { 14 | System.out.println("run方法中的状态:" + this.getState() + " of " + this.getName()); 15 | System.out.println("run方法中的状态:" + Thread.currentThread().getState() + " of " + Thread.currentThread().getName()); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example1/Thread2.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.supplement.example1; 2 | 3 | /** 4 | * Created by Brian on 2016/4/17. 5 | */ 6 | public class Thread2 extends Thread { 7 | 8 | @Override 9 | public void run() { 10 | try { 11 | System.out.println("begin sleep,run方法中的状态:" + this.getState() + " of " + this.getName()); 12 | System.out.println("begin sleep,run方法中的状态:" + Thread.currentThread().getState() + " of " + Thread.currentThread().getName()); 13 | Thread.sleep(10000); 14 | System.out.println("end sleep,run方法中的状态:" + this.getState() + " of " + this.getName()); 15 | System.out.println("end sleep,run方法中的状态:" + Thread.currentThread().getState() + " of " + Thread.currentThread().getName()); 16 | } catch (InterruptedException e) { 17 | e.printStackTrace(); 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example1/Thread3.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.supplement.example1; 2 | 3 | /** 4 | * Created by Brian on 2016/4/17. 5 | */ 6 | public class Thread3 extends Thread { 7 | 8 | @Override 9 | public void run() { 10 | MyService.serviveMethod(); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example2/Run2_groupAddThread.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.supplement.example2; 2 | 3 | /** 4 | * Created by Brian on 2016/4/17. 5 | */ 6 | 7 | /** 8 | * P286 9 | * 线程对象关联线程组,一级关联 10 | */ 11 | public class Run2_groupAddThread { 12 | public static void main(String[] args) { 13 | ThreadA a = new ThreadA(); 14 | ThreadB b = new ThreadB(); 15 | ThreadGroup group = new ThreadGroup("Brian's group"); 16 | Thread athread = new Thread(group, a); 17 | Thread bthread = new Thread(group, b); 18 | athread.start(); 19 | bthread.start(); 20 | System.out.println("活动的线程数为:" + group.activeCount()); 21 | System.out.println("线程组的名称为:" + group.getName()); 22 | } 23 | } 24 | 25 | /* 26 | 输出: 27 | 活动的线程数为:2 28 | ThreadName = Thread-3 29 | ThreadName = Thread-2 30 | 线程组的名称为:Brian's group 31 | ThreadName = Thread-2 32 | ThreadName = Thread-3 33 | ThreadName = Thread-2 34 | ThreadName = Thread-3 35 | */ -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example2/Run2_threadRunSyn.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.supplement.example2; 2 | 3 | /** 4 | * Created by Brian on 2016/4/17. 5 | */ 6 | 7 | /** 8 | * P291 9 | * 使线程具有有序性 10 | */ 11 | public class Run2_threadRunSyn { 12 | public static void main(String[] args) { 13 | Object lock = new Object(); 14 | MyThread a = new MyThread(lock, "A", 1); 15 | MyThread b = new MyThread(lock, "B", 2); 16 | MyThread c = new MyThread(lock, "C", 0); 17 | a.start(); 18 | b.start(); 19 | c.start(); 20 | } 21 | } 22 | 23 | /* 24 | 输出: 25 | ThreadName=Thread-0 runCount = 1 A 26 | ThreadName=Thread-1 runCount = 2 B 27 | ThreadName=Thread-2 runCount = 3 C 28 | ThreadName=Thread-0 runCount = 4 A 29 | ThreadName=Thread-1 runCount = 5 B 30 | ThreadName=Thread-2 runCount = 6 C 31 | ThreadName=Thread-0 runCount = 7 A 32 | ThreadName=Thread-1 runCount = 8 B 33 | ThreadName=Thread-2 runCount = 9 C 34 | */ -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example2/ThreadA.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.supplement.example2; 2 | 3 | /** 4 | * Created by Brian on 2016/4/17. 5 | */ 6 | public class ThreadA extends Thread { 7 | @Override 8 | public void run() { 9 | try { 10 | while (!Thread.currentThread().isInterrupted()) { 11 | System.out.println("ThreadName = " + Thread.currentThread().getName()); 12 | Thread.sleep(3000); 13 | } 14 | } catch (InterruptedException e) { 15 | e.printStackTrace(); 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example2/ThreadB.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.supplement.example2; 2 | 3 | /** 4 | * Created by Brian on 2016/4/17. 5 | */ 6 | public class ThreadB extends Thread { 7 | @Override 8 | public void run() { 9 | try { 10 | while (!Thread.currentThread().isInterrupted()) { 11 | System.out.println("ThreadName = " + Thread.currentThread().getName()); 12 | Thread.sleep(3000); 13 | } 14 | } catch (InterruptedException e) { 15 | e.printStackTrace(); 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example3/DateTools1.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.supplement.example3; 2 | 3 | import java.text.ParseException; 4 | import java.text.SimpleDateFormat; 5 | import java.util.Date; 6 | 7 | /** 8 | * Created by Brian on 2016/4/17. 9 | */ 10 | public class DateTools1 { 11 | public static Date parse(String formatPattern, String dateString) throws ParseException { 12 | return new SimpleDateFormat(formatPattern).parse(dateString); 13 | } 14 | 15 | public static String format(String formatPattern, Date date) { 16 | return new SimpleDateFormat(formatPattern).format(date).toString(); 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example3/DateTools2.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.supplement.example3; 2 | 3 | import java.text.SimpleDateFormat; 4 | 5 | /** 6 | * Created by Brian on 2016/4/17. 7 | */ 8 | public class DateTools2 { 9 | private static ThreadLocal tl = new ThreadLocal(); 10 | 11 | public static SimpleDateFormat getSimpleDateFormat(String datePattern) { 12 | SimpleDateFormat sdf = null; 13 | sdf = tl.get(); 14 | if (sdf == null) { 15 | sdf = new SimpleDateFormat(datePattern); 16 | tl.set(sdf); 17 | } 18 | return sdf; 19 | } 20 | 21 | } 22 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example4/Run4_threadCreateException.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.supplement.example4; 2 | 3 | /** 4 | * Created by Brian on 2016/4/17. 5 | */ 6 | 7 | /** 8 | * P297 9 | * 线程中出现异常 10 | */ 11 | public class Run4_threadCreateException { 12 | public static void main(String[] args) { 13 | Thread1 t = new Thread1(); 14 | t.start(); 15 | } 16 | } 17 | 18 | /* 19 | 输出: 20 | Exception in thread "Thread-0" java.lang.NullPointerException 21 | at com.brianway.learning.java.multithread.supplement.example4.Thread1.run(Thread1.java:10) 22 | */ -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example4/Thread1.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.supplement.example4; 2 | 3 | /** 4 | * Created by Brian on 2016/4/17. 5 | */ 6 | public class Thread1 extends Thread { 7 | @Override 8 | public void run() { 9 | String username = null; 10 | System.out.println(username.hashCode()); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example5/Run5_threadGroup1.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.supplement.example5; 2 | 3 | /** 4 | * Created by Brian on 2016/4/17. 5 | */ 6 | 7 | /** 8 | * p299 9 | * 线程组内处理异常 10 | */ 11 | public class Run5_threadGroup1 { 12 | public static void main(String[] args) { 13 | ThreadGroup group = new ThreadGroup("Brian's group"); 14 | Thread1[] threads = new Thread1[10]; 15 | for (int i = 0; i < threads.length; i++) { 16 | threads[i] = new Thread1(group, "线程" + (i + 1), "1"); 17 | threads[i].start(); 18 | } 19 | Thread1 newT = new Thread1(group, "线程报错", "a"); 20 | newT.start(); 21 | } 22 | } 23 | 24 | /* 25 | 一个线程异常不会停止组内其他线程 26 | */ -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example5/Thread1.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.supplement.example5; 2 | 3 | /** 4 | * Created by Brian on 2016/4/17. 5 | */ 6 | public class Thread1 extends Thread { 7 | private String num; 8 | 9 | public Thread1(ThreadGroup group, String name, String num) { 10 | super(group, name); 11 | this.num = num; 12 | } 13 | 14 | @Override 15 | public void run() { 16 | int numInt = Integer.parseInt(num); 17 | while (true) { 18 | System.out.println("死循环中:" + Thread.currentThread().getName()); 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example5/Thread2.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.supplement.example5; 2 | 3 | /** 4 | * Created by Brian on 2016/4/17. 5 | */ 6 | public class Thread2 extends Thread { 7 | private String num; 8 | 9 | public Thread2(ThreadGroup group, String name, String num) { 10 | super(group, name); 11 | this.num = num; 12 | } 13 | 14 | @Override 15 | public void run() { 16 | int numInt = Integer.parseInt(num); 17 | while (this.isInterrupted() == false) { 18 | System.out.println("死循环中:" + Thread.currentThread().getName()); 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example5/ThreadGroup2.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.supplement.example5; 2 | 3 | /** 4 | * Created by Brian on 2016/4/17. 5 | */ 6 | public class ThreadGroup2 extends ThreadGroup { 7 | 8 | public ThreadGroup2(String name) { 9 | super(name); 10 | } 11 | 12 | @Override 13 | public void uncaughtException(Thread t, Throwable e) { 14 | super.uncaughtException(t, e); 15 | this.interrupt(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example6/MyThread.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.supplement.example6; 2 | 3 | /** 4 | * Created by Brian on 2016/4/17. 5 | */ 6 | public class MyThread extends Thread { 7 | private String num = "a"; 8 | 9 | public MyThread() { 10 | } 11 | 12 | public MyThread(MyThreadGroup group, String name) { 13 | super(group, name); 14 | } 15 | 16 | @Override 17 | public void run() { 18 | int numInt = Integer.parseInt(num); 19 | System.out.println("在线程中打印:" + (numInt + 1)); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example6/MyThreadGroup.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.supplement.example6; 2 | 3 | /** 4 | * Created by Brian on 2016/4/17. 5 | */ 6 | public class MyThreadGroup extends java.lang.ThreadGroup { 7 | 8 | public MyThreadGroup(String name) { 9 | super(name); 10 | } 11 | 12 | @Override 13 | public void uncaughtException(Thread t, Throwable e) { 14 | super.uncaughtException(t, e); 15 | System.out.println("线程组的异常处理"); 16 | e.printStackTrace(); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example6/ObjectUncaughtExceptionHandler.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.supplement.example6; 2 | 3 | /** 4 | * Created by Brian on 2016/4/17. 5 | */ 6 | 7 | import java.lang.Thread.UncaughtExceptionHandler; 8 | 9 | public class ObjectUncaughtExceptionHandler implements UncaughtExceptionHandler { 10 | public void uncaughtException(Thread t, Throwable e) { 11 | System.out.println("对象的异常处理"); 12 | e.printStackTrace(); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example6/StateUncaughtExceptionHandler.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.supplement.example6; 2 | 3 | /** 4 | * Created by Brian on 2016/4/17. 5 | */ 6 | 7 | import java.lang.Thread.UncaughtExceptionHandler; 8 | 9 | public class StateUncaughtExceptionHandler implements UncaughtExceptionHandler { 10 | public void uncaughtException(Thread t, Throwable e) { 11 | System.out.println("静态的异常处理"); 12 | e.printStackTrace(); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example1/HasLocalNum.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.synchronize.example1; 2 | 3 | /** 4 | * Created by Brian on 2016/4/11. 5 | */ 6 | 7 | public class HasLocalNum { 8 | public void addI(String username) { 9 | try { 10 | int num = 0; 11 | if (username.equals("a")) { 12 | num = 100; 13 | System.out.println("a set over"); 14 | Thread.sleep(1000); 15 | 16 | } else { 17 | num = 200; 18 | System.out.println("b set over"); 19 | } 20 | System.out.println(username + " num= " + num); 21 | } catch (InterruptedException e) { 22 | e.printStackTrace(); 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example1/Run1_local.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.synchronize.example1; 2 | 3 | /** 4 | * Created by Brian on 2016/4/11. 5 | */ 6 | 7 | /** 8 | * P53例子 9 | * 方法内局部变量则不存在“非线程安全”问题 10 | */ 11 | 12 | public class Run1_local { 13 | public static void main(String[] args) { 14 | HasLocalNum numRef = new HasLocalNum(); 15 | ThreadA threadA = new ThreadA(numRef); 16 | threadA.start(); 17 | ThreadB threadB = new ThreadB(numRef); 18 | threadB.start(); 19 | } 20 | } 21 | 22 | 23 | /* 24 | 输出: 25 | a set over 26 | b set over 27 | b num= 200 28 | a num= 100 29 | 30 | */ -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example1/ThreadA.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.synchronize.example1; 2 | 3 | /** 4 | * Created by Brian on 2016/4/11. 5 | */ 6 | public class ThreadA extends Thread { 7 | private HasLocalNum numRef; 8 | 9 | public ThreadA(HasLocalNum numRef) { 10 | super(); 11 | this.numRef = numRef; 12 | } 13 | 14 | @Override 15 | public void run() { 16 | super.run(); 17 | numRef.addI("a"); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example1/ThreadB.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.synchronize.example1; 2 | 3 | /** 4 | * Created by Brian on 2016/4/11. 5 | */ 6 | public class ThreadB extends Thread { 7 | private HasLocalNum numRef; 8 | 9 | public ThreadB(HasLocalNum numRef) { 10 | super(); 11 | this.numRef = numRef; 12 | } 13 | 14 | @Override 15 | public void run() { 16 | super.run(); 17 | numRef.addI("b"); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example10/Run10_synMoreObjectStaticOneLock.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.synchronize.example10; 2 | 3 | /** 4 | * Created by brian on 2016/4/13. 5 | */ 6 | 7 | /** 8 | * P100 9 | * Class锁可以对类的所有对象实例起作用 10 | */ 11 | public class Run10_synMoreObjectStaticOneLock { 12 | public static void main(String[] args) { 13 | Service service1 = new Service(); 14 | Service service2 = new Service(); 15 | 16 | ThreadA a = new ThreadA(service1); 17 | a.setName("A"); 18 | a.start(); 19 | ThreadB b = new ThreadB(service2); 20 | b.setName("B"); 21 | b.start(); 22 | 23 | } 24 | } 25 | 26 | /* 27 | 输出: 28 | 线程名:A 在 1460479094611进入printA 29 | 线程名:A 在 1460479097611离开printA 30 | 线程名:B 在 1460479097611进入printB 31 | 线程名:B 在 1460479097611离开printB 32 | */ 33 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example10/Run10_synTwoLock.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.synchronize.example10; 2 | 3 | /** 4 | * Created by brian on 2016/4/13. 5 | */ 6 | 7 | /** 8 | * P97 9 | * 验证synchronized关键字加载static静态方法和加到非静态方法不是同一个锁 10 | * 一个是Class类上锁,一个是对象上锁 11 | */ 12 | public class Run10_synTwoLock { 13 | public static void main(String[] args) { 14 | Service service = new Service(); 15 | 16 | ThreadA a = new ThreadA(service); 17 | a.setName("A"); 18 | a.start(); 19 | ThreadB b = new ThreadB(service); 20 | b.setName("B"); 21 | b.start(); 22 | ThreadC c = new ThreadC(service); 23 | c.setName("C"); 24 | c.start(); 25 | } 26 | } 27 | 28 | /* 29 | 输出: 30 | 线程名:A 在 1460478479803进入printA 31 | 线程名:C 在 1460478479808进入printC 32 | 线程名:C 在 1460478479808离开printC 33 | 线程名:A 在 1460478482804离开printA 34 | 线程名:B 在 1460478482804进入printB 35 | 线程名:B 在 1460478482804离开printB 36 | */ -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example10/ThreadA.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.synchronize.example10; 2 | 3 | /** 4 | * Created by brian on 2016/4/13. 5 | */ 6 | public class ThreadA extends Thread { 7 | private Service service; 8 | 9 | public ThreadA(Service service) { 10 | super(); 11 | this.service = service; 12 | } 13 | 14 | @Override 15 | public void run() { 16 | service.printA(); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example10/ThreadB.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.synchronize.example10; 2 | 3 | /** 4 | * Created by brian on 2016/4/13. 5 | */ 6 | public class ThreadB extends Thread { 7 | private Service service; 8 | 9 | public ThreadB(Service service) { 10 | super(); 11 | this.service = service; 12 | } 13 | 14 | @Override 15 | public void run() { 16 | service.printB(); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example10/ThreadC.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.synchronize.example10; 2 | 3 | /** 4 | * Created by brian on 2016/4/13. 5 | */ 6 | public class ThreadC extends Thread { 7 | private Service service; 8 | 9 | public ThreadC(Service service) { 10 | super(); 11 | this.service = service; 12 | } 13 | 14 | @Override 15 | public void run() { 16 | service.printC(); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example11/Run11_StringAndSyn.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.synchronize.example11; 2 | 3 | /** 4 | * Created by Brian on 2016/4/13. 5 | */ 6 | 7 | /** 8 | * P102 9 | * String作为锁对象 10 | * 常量池->同一锁 11 | */ 12 | public class Run11_StringAndSyn { 13 | public static void main(String[] args) { 14 | ServiceA serviceA = new ServiceA(); 15 | ThreadA a = new ThreadA(serviceA); 16 | a.setName("A"); 17 | a.start(); 18 | ThreadA b = new ThreadA(serviceA); 19 | b.setName("B"); 20 | b.start(); 21 | } 22 | } 23 | 24 | 25 | /* 26 | 输出: 27 | A 28 | A 29 | A 30 | A 31 | A 32 | A 33 | A 34 | A 35 | 36 | */ -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example11/Run11_StringAndSyn2.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.synchronize.example11; 2 | 3 | /** 4 | * Created by Brian on 2016/4/13. 5 | */ 6 | 7 | /** 8 | * P104 9 | * 不使用String作为锁对象 10 | */ 11 | public class Run11_StringAndSyn2 { 12 | public static void main(String[] args) { 13 | ServiceB serviceB = new ServiceB(); 14 | ThreadB a = new ThreadB(serviceB); 15 | a.setName("A"); 16 | a.start(); 17 | ThreadB b = new ThreadB(serviceB); 18 | b.setName("B"); 19 | b.start(); 20 | } 21 | } 22 | 23 | 24 | /* 25 | 输出: 26 | A 27 | B 28 | B 29 | A 30 | A 31 | B 32 | A 33 | B 34 | A 35 | B 36 | B 37 | A 38 | A 39 | B 40 | 41 | */ -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example11/ServiceA.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.synchronize.example11; 2 | 3 | /** 4 | * Created by Brian on 2016/4/13. 5 | */ 6 | public class ServiceA { 7 | public static void print(String stringParam) { 8 | try { 9 | synchronized (stringParam) { 10 | while (true) { 11 | System.out.println(Thread.currentThread().getName()); 12 | Thread.sleep(1000); 13 | } 14 | } 15 | } catch (InterruptedException e) { 16 | e.printStackTrace(); 17 | } 18 | 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example11/ServiceB.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.synchronize.example11; 2 | 3 | /** 4 | * Created by Brian on 2016/4/13. 5 | */ 6 | public class ServiceB { 7 | public static void print(Object object) { 8 | try { 9 | synchronized (object) { 10 | while (true) { 11 | System.out.println(Thread.currentThread().getName()); 12 | Thread.sleep(500); 13 | } 14 | } 15 | } catch (InterruptedException e) { 16 | e.printStackTrace(); 17 | } 18 | 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example11/ThreadA.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.synchronize.example11; 2 | 3 | /** 4 | * Created by Brian on 2016/4/13. 5 | */ 6 | public class ThreadA extends Thread { 7 | ServiceA serviceA; 8 | 9 | public ThreadA(ServiceA serviceA) { 10 | super(); 11 | this.serviceA = serviceA; 12 | } 13 | 14 | @Override 15 | public void run() { 16 | serviceA.print("123"); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example11/ThreadB.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.synchronize.example11; 2 | 3 | /** 4 | * Created by Brian on 2016/4/13. 5 | */ 6 | public class ThreadB extends Thread { 7 | ServiceB serviceB; 8 | 9 | public ThreadB(ServiceB serviceB) { 10 | super(); 11 | this.serviceB = serviceB; 12 | } 13 | 14 | @Override 15 | public void run() { 16 | serviceB.print(new Object()); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example14/Service.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.synchronize.example14; 2 | 3 | /** 4 | * Created by Brian on 2016/4/13. 5 | */ 6 | public class Service { 7 | private String lock = "123"; 8 | 9 | public void testMethod() { 10 | try { 11 | synchronized (lock) { 12 | System.out.println(Thread.currentThread().getName() + " begin " + System.currentTimeMillis()); 13 | lock = "456"; 14 | Thread.sleep(2000); 15 | System.out.println(Thread.currentThread().getName() + " end " + System.currentTimeMillis()); 16 | } 17 | 18 | } catch (InterruptedException e) { 19 | e.printStackTrace(); 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example15/Run15_synchronized.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.synchronize.example15; 2 | 3 | /** 4 | * Created by Brian on 2016/4/13. 5 | */ 6 | 7 | /** 8 | * P130 9 | * synchronized代码块有volatile同步的功能 10 | */ 11 | public class Run15_synchronized { 12 | public static void main(String[] args) { 13 | try { 14 | RunThread2 t = new RunThread2(); 15 | t.start(); 16 | Thread.sleep(1000); 17 | t.setRunning(false); 18 | System.out.println("已经赋值为false"); 19 | } catch (InterruptedException e) { 20 | e.printStackTrace(); 21 | } 22 | } 23 | } 24 | 25 | 26 | /* 27 | 输出: 28 | 进入run了 29 | 线程被停止了 30 | 已经赋值为false 31 | 32 | ----------------- 33 | 注释掉RunThread2类中的synchronized ("any thing"){} 34 | 输出: 35 | 进入run了 36 | 已经赋值为false 37 | 38 | */ -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example15/Run15_volatile.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.synchronize.example15; 2 | 3 | /** 4 | * Created by Brian on 2016/4/13. 5 | */ 6 | 7 | /** 8 | * P121 9 | * 不使用volatile关键字 10 | * JVM配置 -server(IDEA15.02,jdk1.8,WIN7,64bit不加效果也是的) 11 | */ 12 | public class Run15_volatile { 13 | public static void main(String[] args) { 14 | try { 15 | RunThread t = new RunThread(); 16 | t.start(); 17 | Thread.sleep(1000); 18 | t.setRunning(false); 19 | System.out.println("已经赋值为false"); 20 | } catch (InterruptedException e) { 21 | e.printStackTrace(); 22 | } 23 | } 24 | } 25 | 26 | 27 | /* 28 | 输出: 29 | 进入run了 30 | 已经赋值为false 31 | 32 | -------------- 33 | 加上volatile关键字后 34 | 输出: 35 | 进入run了 36 | 已经赋值为false 37 | 线程被停止了 38 | */ -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example15/RunThread.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.synchronize.example15; 2 | 3 | /** 4 | * Created by Brian on 2016/4/13. 5 | */ 6 | public class RunThread extends Thread { 7 | private boolean isRunning = true; 8 | //volatile private boolean isRunning = true; 9 | 10 | public boolean isRunning() { 11 | return isRunning; 12 | } 13 | 14 | public void setRunning(boolean running) { 15 | isRunning = running; 16 | } 17 | 18 | @Override 19 | public void run() { 20 | System.out.println("进入run了"); 21 | while (isRunning == true) { 22 | 23 | } 24 | System.out.println("线程被停止了"); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example15/RunThread2.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.synchronize.example15; 2 | 3 | /** 4 | * Created by Brian on 2016/4/13. 5 | */ 6 | public class RunThread2 extends Thread { 7 | private boolean isRunning = true; 8 | 9 | public boolean isRunning() { 10 | return isRunning; 11 | } 12 | 13 | public void setRunning(boolean running) { 14 | isRunning = running; 15 | } 16 | 17 | @Override 18 | public void run() { 19 | System.out.println("进入run了"); 20 | while (isRunning == true) { 21 | synchronized ("any thing") { 22 | } 23 | } 24 | System.out.println("线程被停止了"); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example16/MyThread.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.synchronize.example16; 2 | 3 | /** 4 | * Created by Brian on 2016/4/13. 5 | */ 6 | public class MyThread extends Thread { 7 | volatile public static int count; 8 | 9 | //synchronized 10 | private static void addCount() { 11 | for (int i = 0; i < 100; i++) { 12 | count++; 13 | } 14 | System.out.println("count=" + count); 15 | } 16 | 17 | @Override 18 | public void run() { 19 | addCount(); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example2/HasSelfPrivateNum.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.synchronize.example2; 2 | 3 | /** 4 | * Created by Brian on 2016/4/11. 5 | */ 6 | public class HasSelfPrivateNum { 7 | private int num = 0; 8 | 9 | synchronized 10 | public void addI(String username) { 11 | try { 12 | if (username.equals("a")) { 13 | num = 100; 14 | System.out.println("a set over"); 15 | Thread.sleep(2000); 16 | 17 | } else { 18 | num = 200; 19 | System.out.println("b set over"); 20 | } 21 | System.out.println(username + " num= " + num); 22 | } catch (InterruptedException e) { 23 | e.printStackTrace(); 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example2/Run2_private01.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.synchronize.example2; 2 | 3 | /** 4 | * Created by Brian on 2016/4/11. 5 | */ 6 | 7 | /** 8 | * P55 9 | * 实例变量非线程安全 10 | */ 11 | public class Run2_private01 { 12 | public static void main(String[] args) { 13 | HasSelfPrivateNum numRef = new HasSelfPrivateNum(); 14 | ThreadA threadA = new ThreadA(numRef); 15 | threadA.start(); 16 | ThreadB threadB = new ThreadB(numRef); 17 | threadB.start(); 18 | } 19 | } 20 | 21 | /* 22 | //synchronized 23 | public void addI(String username) 24 | 输出: 25 | a set over 26 | b set over 27 | b num= 200 28 | a num= 200 29 | 30 | --------------- 31 | HasSelfPrivateNum中addI加synchronized 32 | 输出:(注意顺序) 33 | a set over 34 | a num= 100 35 | b set over 36 | b num= 200 37 | 38 | 39 | */ -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example2/Run2_twoObject.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.synchronize.example2; 2 | 3 | /** 4 | * Created by Brian on 2016/4/11. 5 | */ 6 | 7 | /** 8 | * P58 9 | * 多个对象多个锁 10 | * 关键字synchronized取得的都是对象锁 11 | * 由于两个对象,所以是两个锁,没有同步问题。运行结果异步 12 | */ 13 | public class Run2_twoObject { 14 | public static void main(String[] args) { 15 | HasSelfPrivateNum numRef1 = new HasSelfPrivateNum(); 16 | HasSelfPrivateNum numRef2 = new HasSelfPrivateNum(); 17 | ThreadA threadA = new ThreadA(numRef1); 18 | threadA.start(); 19 | ThreadB threadB = new ThreadB(numRef2); 20 | threadB.start(); 21 | } 22 | } 23 | 24 | 25 | /* 26 | synchronized public void addI 27 | 输出:(注意顺序,由于两个对象,所以是两个锁,没有同步问题。运行结果异步) 28 | a set over 29 | b set over 30 | b num= 200 31 | a num= 100 32 | */ -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example2/ThreadA.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.synchronize.example2; 2 | 3 | /** 4 | * Created by Brian on 2016/4/11. 5 | */ 6 | public class ThreadA extends Thread { 7 | private HasSelfPrivateNum numRef; 8 | 9 | public ThreadA(HasSelfPrivateNum numRef) { 10 | super(); 11 | this.numRef = numRef; 12 | } 13 | 14 | @Override 15 | public void run() { 16 | super.run(); 17 | numRef.addI("a"); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example2/ThreadB.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.synchronize.example2; 2 | 3 | /** 4 | * Created by Brian on 2016/4/11. 5 | */ 6 | public class ThreadB extends Thread { 7 | private HasSelfPrivateNum numRef; 8 | 9 | public ThreadB(HasSelfPrivateNum numRef) { 10 | super(); 11 | this.numRef = numRef; 12 | } 13 | 14 | @Override 15 | public void run() { 16 | super.run(); 17 | numRef.addI("b"); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example3/MyObject.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.synchronize.example3; 2 | 3 | /** 4 | * Created by Brian on 2016/4/12. 5 | */ 6 | 7 | public class MyObject { 8 | synchronized 9 | public void methodA() { 10 | try { 11 | System.out.println("begin methodA threadName=" + Thread.currentThread().getName()); 12 | Thread.sleep(5000); 13 | System.out.println(Thread.currentThread().getName() + " end"); 14 | } catch (InterruptedException e) { 15 | e.printStackTrace(); 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example3/Run3_synchronized01.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.synchronize.example3; 2 | 3 | /** 4 | * Created by Brian on 2016/4/12. 5 | */ 6 | 7 | /** 8 | * P60 9 | * synchronized方法与锁对象 10 | */ 11 | public class Run3_synchronized01 { 12 | public static void main(String[] args) { 13 | MyObject object = new MyObject(); 14 | ThreadA a = new ThreadA(object); 15 | a.setName("A "); 16 | ThreadB b = new ThreadB(object); 17 | b.setName("B "); 18 | a.start(); 19 | b.start(); 20 | } 21 | } 22 | 23 | /* 24 | public void methodA()没加synchronized 25 | 输出: 26 | begin methodA threadName=B 27 | begin methodA threadName=A 28 | A end 29 | B end 30 | 31 | ------------------- 32 | 33 | public void methodA()加synchronized 34 | 输出: 35 | begin methodA threadName=A 36 | A end 37 | begin methodA threadName=B 38 | B end 39 | 40 | */ -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example3/ThreadA.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.synchronize.example3; 2 | 3 | /** 4 | * Created by Brian on 2016/4/12. 5 | */ 6 | public class ThreadA extends Thread { 7 | private MyObject object; 8 | 9 | public ThreadA(MyObject object) { 10 | super(); 11 | this.object = object; 12 | } 13 | 14 | @Override 15 | public void run() { 16 | super.run(); 17 | object.methodA(); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example3/ThreadB.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.synchronize.example3; 2 | 3 | /** 4 | * Created by Brian on 2016/4/12. 5 | */ 6 | public class ThreadB extends Thread { 7 | private MyObject object; 8 | 9 | public ThreadB(MyObject object) { 10 | super(); 11 | this.object = object; 12 | } 13 | 14 | @Override 15 | public void run() { 16 | super.run(); 17 | object.methodA(); 18 | } 19 | } -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example4/ThreadA.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.synchronize.example4; 2 | 3 | /** 4 | * Created by Brian on 2016/4/12. 5 | */ 6 | public class ThreadA extends Thread { 7 | private MyObject object; 8 | 9 | public ThreadA(MyObject object) { 10 | super(); 11 | this.object = object; 12 | } 13 | 14 | @Override 15 | public void run() { 16 | super.run(); 17 | object.methodA(); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example4/ThreadB.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.synchronize.example4; 2 | 3 | /** 4 | * Created by Brian on 2016/4/12. 5 | */ 6 | public class ThreadB extends Thread { 7 | private MyObject object; 8 | 9 | public ThreadB(MyObject object) { 10 | super(); 11 | this.object = object; 12 | } 13 | 14 | @Override 15 | public void run() { 16 | super.run(); 17 | object.methodB(); 18 | } 19 | } -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example5/Main.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.synchronize.example5; 2 | 3 | /** 4 | * Created by Brian on 2016/4/12. 5 | */ 6 | public class Main { 7 | protected int i = 10; 8 | 9 | synchronized public void operateIinMain() { 10 | try { 11 | i--; 12 | System.out.println("main print i=" + i); 13 | Thread.sleep(100); 14 | } catch (InterruptedException e) { 15 | e.printStackTrace(); 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example5/Run5_lockRein.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.synchronize.example5; 2 | 3 | /** 4 | * Created by Brian on 2016/4/12. 5 | */ 6 | 7 | /** 8 | * P67 9 | * synchronized锁重入,支持继承 10 | */ 11 | public class Run5_lockRein { 12 | public static void main(String[] args) { 13 | Thread t = new Thread() { 14 | @Override 15 | public void run() { 16 | Sub sub = new Sub(); 17 | sub.operateIinSub(); 18 | } 19 | }; 20 | t.start(); 21 | 22 | } 23 | 24 | } 25 | 26 | /* 27 | 输出: 28 | sub print i=9 29 | main print i=8 30 | sub print i=7 31 | main print i=6 32 | sub print i=5 33 | main print i=4 34 | sub print i=3 35 | main print i=2 36 | sub print i=1 37 | main print i=0 38 | */ 39 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example5/Sub.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.synchronize.example5; 2 | 3 | /** 4 | * Created by Brian on 2016/4/12. 5 | */ 6 | public class Sub extends Main { 7 | synchronized public void operateIinSub() { 8 | try { 9 | while (i > 0) { 10 | i--; 11 | System.out.println("sub print i=" + i); 12 | Thread.sleep(100); 13 | this.operateIinMain(); 14 | } 15 | 16 | } catch (InterruptedException e) { 17 | e.printStackTrace(); 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example6/Service.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.synchronize.example6; 2 | 3 | /** 4 | * Created by Brian on 2016/4/12. 5 | */ 6 | public class Service { 7 | synchronized public void testMethod() { 8 | if (Thread.currentThread().getName().equals("a")) { 9 | System.out.println("ThreadName=" + Thread.currentThread().getName() + " run beginTime=" + System.currentTimeMillis()); 10 | 11 | int i = 1; 12 | while (i == 1) { 13 | if (("" + Math.random()).substring(0, 8).equals("0.123456")) { 14 | System.out.println("ThreadName=" + Thread.currentThread().getName() + " run exceptionTime=" + System.currentTimeMillis()); 15 | Integer.parseInt("a"); 16 | } 17 | } 18 | } else { 19 | System.out.println("Thread b run Time=" + System.currentTimeMillis()); 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example6/ThreadA.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.synchronize.example6; 2 | 3 | /** 4 | * Created by Brian on 2016/4/12. 5 | */ 6 | public class ThreadA extends Thread { 7 | private Service service; 8 | 9 | public ThreadA(String name, Service service) { 10 | super(name); 11 | this.service = service; 12 | } 13 | 14 | @Override 15 | public void run() { 16 | service.testMethod(); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example6/ThreadB.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.synchronize.example6; 2 | 3 | /** 4 | * Created by Brian on 2016/4/12. 5 | */ 6 | public class ThreadB extends Thread { 7 | private Service service; 8 | 9 | public ThreadB(String name, Service service) { 10 | super(name); 11 | this.service = service; 12 | } 13 | 14 | @Override 15 | public void run() { 16 | service.testMethod(); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example7/Main.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.synchronize.example7; 2 | 3 | /** 4 | * Created by Brian on 2016/4/12. 5 | */ 6 | public class Main { 7 | synchronized public void testMethod() { 8 | try { 9 | System.out.println("threadName= " + Thread.currentThread().getName() + " in main 下一步 sleep begin time =" + System.currentTimeMillis()); 10 | Thread.sleep(5000); 11 | System.out.println("threadName= " + Thread.currentThread().getName() + " in main 下一步 sleep end time =" + System.currentTimeMillis()); 12 | } catch (InterruptedException e) { 13 | e.printStackTrace(); 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example7/MyThread.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.synchronize.example7; 2 | 3 | /** 4 | * Created by Brian on 2016/4/12. 5 | */ 6 | public class MyThread extends Thread { 7 | private Sub sub; 8 | 9 | public MyThread(Sub sub) { 10 | super(); 11 | this.sub = sub; 12 | } 13 | 14 | @Override 15 | public void run() { 16 | sub.testMethod(); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example7/Sub.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.synchronize.example7; 2 | 3 | /** 4 | * Created by Brian on 2016/4/12. 5 | */ 6 | public class Sub extends Main { 7 | //synchronized 8 | public void testMethod() { 9 | try { 10 | System.out.println("threadName= " + Thread.currentThread().getName() + " in sub 下一步 sleep begin time =" + System.currentTimeMillis()); 11 | Thread.sleep(2000); 12 | System.out.println("threadName= " + Thread.currentThread().getName() + " in sub 下一步 sleep end time =" + System.currentTimeMillis()); 13 | super.testMethod(); 14 | } catch (InterruptedException e) { 15 | e.printStackTrace(); 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example8/CommonUtils.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.synchronize.example8; 2 | 3 | /** 4 | * Created by Brian on 2016/4/12. 5 | */ 6 | public class CommonUtils { 7 | public static long beginTime1; 8 | public static long endTime1; 9 | public static long beginTime2; 10 | public static long endTime2; 11 | } 12 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example8/MyThreadA.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.synchronize.example8; 2 | 3 | /** 4 | * Created by Brian on 2016/4/12. 5 | */ 6 | public class MyThreadA extends Thread { 7 | private TaskA taskA; 8 | 9 | public MyThreadA(TaskA taskA) { 10 | super(); 11 | this.taskA = taskA; 12 | } 13 | 14 | @Override 15 | public void run() { 16 | super.run(); 17 | if (this.getName().equals("a")) { 18 | CommonUtils.beginTime1 = System.currentTimeMillis(); 19 | taskA.doLongTimeTask(); 20 | CommonUtils.endTime1 = System.currentTimeMillis(); 21 | } else if (this.getName().equals("b")) { 22 | CommonUtils.beginTime2 = System.currentTimeMillis(); 23 | taskA.doLongTimeTask(); 24 | CommonUtils.endTime2 = System.currentTimeMillis(); 25 | } else { 26 | System.out.println("unexpected name"); 27 | } 28 | 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example8/MyThreadB.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.synchronize.example8; 2 | 3 | /** 4 | * Created by Brian on 2016/4/12. 5 | */ 6 | public class MyThreadB extends Thread { 7 | private TaskB taskB; 8 | 9 | public MyThreadB(TaskB taskB) { 10 | super(); 11 | this.taskB = taskB; 12 | } 13 | 14 | @Override 15 | public void run() { 16 | super.run(); 17 | if (this.getName().equals("c")) { 18 | CommonUtils.beginTime1 = System.currentTimeMillis(); 19 | taskB.doLongTimeTask(); 20 | CommonUtils.endTime1 = System.currentTimeMillis(); 21 | } else if (this.getName().equals("d")) { 22 | CommonUtils.beginTime2 = System.currentTimeMillis(); 23 | taskB.doLongTimeTask(); 24 | CommonUtils.endTime2 = System.currentTimeMillis(); 25 | } else { 26 | System.out.println("unexpected name"); 27 | } 28 | 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example8/TaskA.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.synchronize.example8; 2 | 3 | /** 4 | * Created by Brian on 2016/4/12. 5 | */ 6 | public class TaskA { 7 | private String getData1; 8 | private String getData2; 9 | 10 | public synchronized void doLongTimeTask() { 11 | try { 12 | System.out.println("begin task"); 13 | Thread.sleep(3000); 14 | getData1 = "长时间处理任务后从远程返回的值1 threadName=" + Thread.currentThread().getName(); 15 | getData2 = "长时间处理任务后从远程返回的值2 threadName=" + Thread.currentThread().getName(); 16 | System.out.println(getData1); 17 | System.out.println(getData2); 18 | System.out.println("end task"); 19 | } catch (InterruptedException e) { 20 | e.printStackTrace(); 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/MyObject.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.synchronize.example9; 2 | 3 | /** 4 | * Created by Brian on 2016/4/12. 5 | */ 6 | public class MyObject { 7 | } 8 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/MyObject1.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.synchronize.example9; 2 | 3 | /** 4 | * Created by Brian on 2016/4/12. 5 | */ 6 | public class MyObject1 extends MyObject { 7 | synchronized public void speedPrintString() { 8 | System.out.println("speedPrintString ____getLock time=" + System.currentTimeMillis() + " run ThreadName=" + Thread.currentThread().getName()); 9 | System.out.println("*******************"); 10 | System.out.println("speedPrintString releaseLock time=" + System.currentTimeMillis() + " run ThreadName=" + Thread.currentThread().getName()); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/MyObject2.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.synchronize.example9; 2 | 3 | /** 4 | * Created by Brian on 2016/4/12. 5 | */ 6 | public class MyObject2 extends MyObject { 7 | public void speedPrintString() { 8 | synchronized (this) { 9 | System.out.println("speedPrintString ____getLock time=" + System.currentTimeMillis() + " run ThreadName=" + Thread.currentThread().getName()); 10 | System.out.println("*******************"); 11 | System.out.println("speedPrintString releaseLock time=" + System.currentTimeMillis() + " run ThreadName=" + Thread.currentThread().getName()); 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/MyThread.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.synchronize.example9; 2 | 3 | /** 4 | * Created by Brian on 2016/4/12. 5 | */ 6 | public class MyThread extends Thread { 7 | private Service service; 8 | private MyObject object; 9 | 10 | public MyThread(Service service, MyObject object) { 11 | super(); 12 | this.object = object; 13 | this.service = service; 14 | } 15 | 16 | @Override 17 | public void run() { 18 | super.run(); 19 | service.testMethod1(object); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/Service.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.synchronize.example9; 2 | 3 | /** 4 | * Created by Brian on 2016/4/12. 5 | */ 6 | public class Service { 7 | public void testMethod1(MyObject object) { 8 | synchronized (object) { 9 | try { 10 | System.out.println("testMethod1 ____getLock time=" + System.currentTimeMillis() + " run ThreadName=" + Thread.currentThread().getName()); 11 | Thread.sleep(2000); 12 | System.out.println("testMethod1 releaseLock time=" + System.currentTimeMillis() + " run ThreadName=" + Thread.currentThread().getName()); 13 | } catch (InterruptedException e) { 14 | e.printStackTrace(); 15 | } 16 | } 17 | 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/Thread1.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.synchronize.example9; 2 | 3 | /** 4 | * Created by Brian on 2016/4/12. 5 | */ 6 | public class Thread1 extends Thread { 7 | private MyObject1 object1; 8 | 9 | public Thread1(MyObject1 object1) { 10 | this.object1 = object1; 11 | } 12 | 13 | @Override 14 | public void run() { 15 | super.run(); 16 | object1.speedPrintString(); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/Thread2.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.synchronize.example9; 2 | 3 | /** 4 | * Created by Brian on 2016/4/12. 5 | */ 6 | public class Thread2 extends Thread { 7 | private MyObject2 object2; 8 | 9 | public Thread2(MyObject2 object2) { 10 | this.object2 = object2; 11 | } 12 | 13 | @Override 14 | public void run() { 15 | super.run(); 16 | object2.speedPrintString(); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example1/MyTask.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.timer.example1; 2 | 3 | import java.util.Date; 4 | import java.util.TimerTask; 5 | 6 | /** 7 | * Created by Brian on 2016/4/15. 8 | */ 9 | public class MyTask extends TimerTask { 10 | @Override 11 | public void run() { 12 | System.out.println("任务执行了,时间为:" + new Date()); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example1/Run1_timer1.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.timer.example1; 2 | 3 | import java.util.Calendar; 4 | import java.util.Date; 5 | import java.util.Timer; 6 | 7 | /** 8 | * Created by Brian on 2016/4/15. 9 | */ 10 | 11 | /** 12 | * P242 13 | * schedule(TimerTask task, Date time)测试,在未来执行的效果 14 | * Timer的构造方法会新启一个线程,且非守护线程 15 | */ 16 | public class Run1_timer1 { 17 | public static void main(String[] args) { 18 | System.out.println("当前时间为:" + new Date()); 19 | Calendar calendar = Calendar.getInstance(); 20 | calendar.add(Calendar.SECOND, 5); 21 | Date runDate = calendar.getTime(); 22 | 23 | MyTask task = new MyTask(); 24 | Timer timer = new Timer(); 25 | timer.schedule(task, runDate); 26 | } 27 | } 28 | 29 | /* 30 | 输出: 31 | 当前时间为:Fri Apr 15 22:10:14 CST 2016 32 | 任务执行了,时间为:Fri Apr 15 22:10:19 CST 2016 33 | */ -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example1/Run1_timer2.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.timer.example1; 2 | 3 | import java.util.Calendar; 4 | import java.util.Date; 5 | import java.util.Timer; 6 | 7 | /** 8 | * Created by Brian on 2016/4/15. 9 | */ 10 | 11 | /** 12 | * P243 13 | * schedule(TimerTask task, Date time)测试,在未来执行的效果 14 | * Timer的构造方法会新启一个守护线程 15 | * 迅速结束,task任务未被执行 16 | */ 17 | public class Run1_timer2 { 18 | public static void main(String[] args) { 19 | System.out.println("当前时间为:" + new Date()); 20 | Calendar calendar = Calendar.getInstance(); 21 | calendar.add(Calendar.SECOND, 5); 22 | Date runDate = calendar.getTime(); 23 | 24 | MyTask task = new MyTask(); 25 | Timer timer = new Timer(true);//守护线程 26 | timer.schedule(task, runDate); 27 | } 28 | } 29 | 30 | /* 31 | 输出: 32 | 当前时间为:Fri Apr 15 22:12:28 CST 2016 33 | */ -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example1/Run1_timer3.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.timer.example1; 2 | 3 | import java.util.Calendar; 4 | import java.util.Date; 5 | import java.util.Timer; 6 | 7 | /** 8 | * Created by Brian on 2016/4/15. 9 | */ 10 | 11 | /** 12 | * P244 13 | * schedule(TimerTask task, Date time)测试,提前运行的效果 14 | */ 15 | public class Run1_timer3 { 16 | public static void main(String[] args) { 17 | System.out.println("当前时间为:" + new Date()); 18 | Calendar calendar = Calendar.getInstance(); 19 | calendar.set(Calendar.SECOND, calendar.get(Calendar.SECOND) - 10); 20 | Date runDate = calendar.getTime(); 21 | System.out.println("计划时间为:" + runDate); 22 | MyTask task = new MyTask(); 23 | Timer timer = new Timer(); 24 | timer.schedule(task, runDate); 25 | } 26 | } 27 | 28 | /* 29 | 输出: 30 | 当前时间为:Fri Apr 15 22:15:40 CST 2016 31 | 计划时间为:Fri Apr 15 22:15:30 CST 2016 32 | 任务执行了,时间为:Fri Apr 15 22:15:40 CST 2016 33 | */ -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example1/TaskA.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.timer.example1; 2 | 3 | import java.util.Date; 4 | import java.util.TimerTask; 5 | 6 | /** 7 | * Created by Brian on 2016/4/15. 8 | */ 9 | public class TaskA extends TimerTask { 10 | @Override 11 | public void run() { 12 | try { 13 | System.out.println("A begin timer=" + new Date()); 14 | Thread.sleep(10000); 15 | System.out.println("A end timer=" + new Date()); 16 | } catch (InterruptedException e) { 17 | e.printStackTrace(); 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example1/TaskB.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.timer.example1; 2 | 3 | import java.util.Date; 4 | import java.util.TimerTask; 5 | 6 | /** 7 | * Created by Brian on 2016/4/15. 8 | */ 9 | public class TaskB extends TimerTask { 10 | @Override 11 | public void run() { 12 | System.out.println("B begin timer=" + new Date()); 13 | System.out.println("B end timer=" + new Date()); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example2/MyTask.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.timer.example2; 2 | 3 | import java.util.Date; 4 | import java.util.TimerTask; 5 | 6 | /** 7 | * Created by Brian on 2016/4/15. 8 | */ 9 | public class MyTask extends TimerTask { 10 | @Override 11 | public void run() { 12 | System.out.println("任务执行了,时间为:" + new Date()); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example2/TaskA.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.timer.example2; 2 | 3 | import java.util.Date; 4 | import java.util.TimerTask; 5 | 6 | /** 7 | * Created by Brian on 2016/4/15. 8 | */ 9 | public class TaskA extends TimerTask { 10 | @Override 11 | public void run() { 12 | try { 13 | System.out.println("A begin timer=" + new Date()); 14 | Thread.sleep(5000); 15 | System.out.println("A end timer=" + new Date()); 16 | } catch (InterruptedException e) { 17 | e.printStackTrace(); 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example3/MyTask.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.timer.example3; 2 | 3 | import java.util.TimerTask; 4 | 5 | /** 6 | * Created by brian on 2016/4/15. 7 | */ 8 | public class MyTask extends TimerTask { 9 | private int i; 10 | 11 | public MyTask(int i) { 12 | this.i = i; 13 | } 14 | 15 | @Override 16 | public void run() { 17 | System.out.println("第" + i + "次没有被cancel取消"); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example3/TaskA.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.timer.example3; 2 | 3 | import java.util.Date; 4 | import java.util.TimerTask; 5 | 6 | /** 7 | * Created by Brian on 2016/4/15. 8 | */ 9 | public class TaskA extends TimerTask { 10 | @Override 11 | public void run() { 12 | System.out.println("A run timer=" + new Date()); 13 | this.cancel(); 14 | System.out.println("A任务自己移除自己"); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example3/TaskA2.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.timer.example3; 2 | 3 | import java.util.Date; 4 | import java.util.TimerTask; 5 | 6 | /** 7 | * Created by Brian on 2016/4/15. 8 | */ 9 | public class TaskA2 extends TimerTask { 10 | @Override 11 | public void run() { 12 | System.out.println("A run timer=" + new Date()); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example3/TaskB.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.timer.example3; 2 | 3 | import java.util.Date; 4 | import java.util.TimerTask; 5 | 6 | /** 7 | * Created by brian on 2016/4/15. 8 | */ 9 | public class TaskB extends TimerTask { 10 | @Override 11 | public void run() { 12 | System.out.println("B run timer=" + new Date()); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example3/TaskB2.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.timer.example3; 2 | 3 | import java.util.Date; 4 | import java.util.TimerTask; 5 | 6 | /** 7 | * Created by Brian on 2016/4/15. 8 | */ 9 | public class TaskB2 extends TimerTask { 10 | @Override 11 | public void run() { 12 | System.out.println("B run timer=" + new Date()); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_schedule1.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java.multithread.timer.example4; 2 | 3 | /** 4 | * Created by brian on 2016/4/15. 5 | */ 6 | 7 | import java.util.Date; 8 | import java.util.Timer; 9 | import java.util.TimerTask; 10 | 11 | /** 12 | * P252 13 | * schedule(TimerTask task, long delay)方法 14 | */ 15 | public class Run4_schedule1 { 16 | static public class MyTask extends TimerTask { 17 | @Override 18 | public void run() { 19 | System.out.println("运行了!时间为:" + new Date()); 20 | } 21 | } 22 | 23 | public static void main(String[] args) { 24 | MyTask task = new MyTask(); 25 | Timer timer = new Timer(); 26 | System.out.println("当前时间:" + new Date()); 27 | timer.schedule(task, 7000); 28 | } 29 | } 30 | 31 | /* 32 | 输出: 33 | 当前时间:Sat Apr 16 00:00:22 CST 2016 34 | 运行了!时间为:Sat Apr 16 00:00:29 CST 2016 35 | 36 | */ -------------------------------------------------------------------------------- /java8/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | java-learning 7 | com.brianway.learning.java 8 | 1.0-SNAPSHOT 9 | 10 | 4.0.0 11 | 12 | java8 13 | 14 | 15 | 16 | junit 17 | junit 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /java8/src/main/java/com/brianway/learning/java8/effective/Ambiguous.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java8.effective; 2 | 3 | /** 4 | * 默认方法解决冲突 5 | */ 6 | public class Ambiguous { 7 | 8 | public static void main(String... args) { 9 | new C().hello(); 10 | } 11 | 12 | interface A { 13 | default void hello() { 14 | System.out.println("Hello from A"); 15 | } 16 | } 17 | 18 | interface B { 19 | default void hello() { 20 | System.out.println("Hello from B"); 21 | } 22 | } 23 | 24 | static class C implements B, A { 25 | public void hello() { 26 | A.super.hello();// Java 8 引入的新语法: X.super.m(...) 27 | // 其中 X 为希望调用 m 方法所在的父接口 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /java8/src/main/java/com/brianway/learning/java8/effective/async/AsyncShopClient.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java8.effective.async; 2 | 3 | import java.util.concurrent.Future; 4 | 5 | /** 6 | * 演示错误处理 7 | */ 8 | public class AsyncShopClient { 9 | 10 | public static void main(String[] args) { 11 | AsyncShop shop = new AsyncShop("BestShop"); 12 | long start = System.nanoTime(); 13 | Future futurePrice = shop.getPrice("myPhone"); 14 | long incocationTime = ((System.nanoTime() - start) / 1_000_000); 15 | System.out.println("Invocation returned after " + incocationTime + " msecs"); 16 | try { 17 | System.out.println("Price is " + futurePrice.get()); 18 | } catch (Exception e) { 19 | throw new RuntimeException(e); 20 | } 21 | long retrivalTime = ((System.nanoTime() - start) / 1_000_000); 22 | System.out.println("Price returned after " + retrivalTime + " msecs"); 23 | } 24 | } -------------------------------------------------------------------------------- /java8/src/main/java/com/brianway/learning/java8/effective/async/Discount.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java8.effective.async; 2 | 3 | import static com.brianway.learning.java8.effective.async.Util.delay; 4 | import static com.brianway.learning.java8.effective.async.Util.format; 5 | 6 | /** 7 | * 折扣类 8 | */ 9 | public class Discount { 10 | 11 | public enum Code { 12 | NONE(0), 13 | SILVER(5), 14 | GOLD(10), 15 | PLATINUM(15), 16 | DIAMOND(20); 17 | 18 | private final int percentage; 19 | 20 | Code(int percentage) { 21 | this.percentage = percentage; 22 | } 23 | } 24 | 25 | public static String applyDiscount(Quote quote) { 26 | return quote.getShopName() + " price is " + Discount.apply(quote.getPrice(), quote.getDiscountCode()); 27 | } 28 | 29 | private static double apply(double price, Code code) { 30 | delay(); 31 | return format(price * (100 - code.percentage) / 100); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /java8/src/main/java/com/brianway/learning/java8/effective/async/ExchangeService.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java8.effective.async; 2 | 3 | import static com.brianway.learning.java8.effective.async.Util.delay; 4 | 5 | /** 6 | * 货币兑换类 7 | */ 8 | public class ExchangeService { 9 | 10 | public enum Money { 11 | USD(1.0), 12 | EUR(1.35387), 13 | GBP(1.69715), 14 | CAD(.92106), 15 | MXN(.07683); 16 | 17 | private final double rate; 18 | 19 | Money(double rate) { 20 | this.rate = rate; 21 | } 22 | } 23 | 24 | public static double getRate(Money source, Money destination) { 25 | return getRateWithDelay(source, destination); 26 | } 27 | 28 | private static double getRateWithDelay(Money source, Money destination) { 29 | delay(); 30 | return destination.rate / source.rate; 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /java8/src/main/java/com/brianway/learning/java8/effective/optional/Car.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java8.effective.optional; 2 | 3 | import java.util.Optional; 4 | 5 | public class Car { 6 | 7 | private Optional insurance; 8 | 9 | public Optional getInsurance() { 10 | return insurance; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /java8/src/main/java/com/brianway/learning/java8/effective/optional/Insurance.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java8.effective.optional; 2 | 3 | public class Insurance { 4 | 5 | private String name; 6 | 7 | public String getName() { 8 | return name; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /java8/src/main/java/com/brianway/learning/java8/effective/optional/Person.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java8.effective.optional; 2 | 3 | import java.util.Optional; 4 | 5 | public class Person { 6 | 7 | private Car car; 8 | 9 | public Optional getCar() { 10 | return Optional.ofNullable(car); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /java8/src/main/java/com/brianway/learning/java8/effective/tech/Peek.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java8.effective.tech; 2 | 3 | import static java.util.stream.Collectors.toList; 4 | 5 | import java.util.List; 6 | import java.util.stream.Stream; 7 | 8 | /** 9 | * 使用日志调试 10 | */ 11 | public class Peek { 12 | 13 | public static void main(String[] args) { 14 | 15 | List result = Stream.of(2, 3, 4, 5) 16 | .peek(x -> System.out.println("taking from stream: " + x)) 17 | .map(x -> x + 17) 18 | .peek(x -> System.out.println("after map: " + x)) 19 | .filter(x -> x % 2 == 0) 20 | .peek(x -> System.out.println("after filter: " + x)) 21 | .limit(3) 22 | .peek(x -> System.out.println("after limit: " + x)) 23 | .collect(toList()); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /java8/src/main/java/com/brianway/learning/java8/streamapi/practice/Trader.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java8.streamapi.practice; 2 | 3 | public class Trader { 4 | 5 | private String name; 6 | private String city; 7 | 8 | public Trader(String n, String c) { 9 | this.name = n; 10 | this.city = c; 11 | } 12 | 13 | public String getName() { 14 | return this.name; 15 | } 16 | 17 | public String getCity() { 18 | return this.city; 19 | } 20 | 21 | public void setCity(String newCity) { 22 | this.city = newCity; 23 | } 24 | 25 | public String toString() { 26 | return "Trader:" + this.name + " in " + this.city; 27 | } 28 | } -------------------------------------------------------------------------------- /java8/src/main/java/com/brianway/learning/java8/streamapi/practice/Transaction.java: -------------------------------------------------------------------------------- 1 | package com.brianway.learning.java8.streamapi.practice; 2 | 3 | public class Transaction { 4 | 5 | private Trader trader; 6 | private int year; 7 | private int value; 8 | 9 | public Transaction(Trader trader, int year, int value) { 10 | this.trader = trader; 11 | this.year = year; 12 | this.value = value; 13 | } 14 | 15 | public Trader getTrader() { 16 | return this.trader; 17 | } 18 | 19 | public int getYear() { 20 | return this.year; 21 | } 22 | 23 | public int getValue() { 24 | return this.value; 25 | } 26 | 27 | public String toString() { 28 | return "{" + this.trader + ", " + 29 | "year: " + this.year + ", " + 30 | "value:" + this.value + "}"; 31 | } 32 | } -------------------------------------------------------------------------------- /java8/src/main/resources/data-building.txt: -------------------------------------------------------------------------------- 1 | The quick brown fox jumped over the lazy dog 2 | The lazy dog jumped over the quick brown fox 3 | -------------------------------------------------------------------------------- /java8/src/main/resources/data-lambda.txt: -------------------------------------------------------------------------------- 1 | Java 2 | 8 3 | Lambdas 4 | In 5 | Action --------------------------------------------------------------------------------