packagejuc;publicclassSaleTicketDemo01{publicstaticvoidmain(String[] args){Ticket ticket=newTicket();newThread(()->{for(int i =0; i <20; i++){
ticket.sale();}},"a").start();newThread(()->{for(int i =0; i <20; i++){
ticket.sale();}},"b").start();newThread(()->{for(int i =0; i <20; i++){
ticket.sale();}},"c").start();}}//资源类classTicket{//属性,方法privateint number=50;publicsynchronizedvoidsale(){if(number>0){System.out.println(Thread.currentThread().getName()+"卖出了"+(number--)+"号票,剩余"+number+"张");}}}
lock
packagejuc;importjava.util.concurrent.locks.Lock;importjava.util.concurrent.locks.ReentrantLock;publicclassSaleTicketDemo02{publicstaticvoidmain(String[] args){Ticket2 ticket=newTicket2();newThread(()->{for(int i =0; i <20; i++) ticket.sale();},"a").start();newThread(()->{for(int i =0; i <20; i++) ticket.sale();},"b").start();newThread(()->{for(int i =0; i <20; i++) ticket.sale();},"c").start();}}classTicket2{//属性,方法privateint number=50;Lock lock=newReentrantLock();publicvoidsale(){
lock.lock();try{//业务代码if(number>0){System.out.println(Thread.currentThread().getName()+"卖出了"+(number--)+"号票,剩余"+number+"张");}}catch(Exception e){
e.printStackTrace();}finally{
lock.unlock();}}}
condition
packagejuc;importjava.util.concurrent.locks.Condition;importjava.util.concurrent.locks.Lock;importjava.util.concurrent.locks.ReentrantLock;publicclassPCDemo01{publicstaticvoidmain(String[] args){Data data=newData();newThread(()->{for(int i =0; i <10; i++){
data.increment();}},"A").start();newThread(()->{for(int i =0; i <10; i++){
data.decrement();;}},"B").start();newThread(()->{for(int i =0; i <10; i++){
data.increment();}},"C").start();newThread(()->{for(int i =0; i <10; i++){
data.decrement();}},"D").start();}}classData{privateint number=0;Lock lock=newReentrantLock();Condition condition=lock.newCondition();publicvoidincrement(){try{
lock.lock();while(number!=0){
condition.await();}
number++;System.out.println(Thread.currentThread().getName()+":"+number);
condition.signalAll();}catch(Exception e){
e.printStackTrace();}finally{
lock.unlock();}}publicvoiddecrement(){try{
lock.lock();while(number==0){
condition.await();}
number--;System.out.println(Thread.currentThread().getName()+":"+number);
condition.signalAll();}catch(Exception e){
e.printStackTrace();}finally{
lock.unlock();}}}
顺序执行
packagejuc;importjava.util.concurrent.locks.Condition;importjava.util.concurrent.locks.Lock;importjava.util.concurrent.locks.ReentrantLock;publicclassPCDemo02{publicstaticvoidmain(String[] args){Data2 data2=newData2();newThread(()->{for(int i =0; i <10; i++)data2.A();},"A").start();newThread(()->{for(int i =0; i <10; i++)data2.B();},"B").start();newThread(()->{for(int i =0; i <10; i++)data2.C();},"C").start();}}classData2{privateLock lock=newReentrantLock();privateCondition condition1=lock.newCondition();privateCondition condition2=lock.newCondition();privateCondition condition3=lock.newCondition();privateint number=1;//1A2B3CpublicvoidA(){
lock.lock();try{while(number!=1){
condition1.await();}System.out.println(Thread.currentThread().getName());
number=2;
condition2.signal();}catch(Exception e){
e.printStackTrace();}finally{
lock.unlock();}}publicvoidB(){
lock.lock();try{while(number!=2){
condition2.await();}System.out.println(Thread.currentThread().getName());
number=3;
condition3.signal();}catch(Exception e){
e.printStackTrace();}finally{
lock.unlock();}}publicvoidC(){
lock.lock();try{while(number!=3){
condition3.await();}System.out.println(Thread.currentThread().getName());
number=1;
condition1.signal();}catch(Exception e){
e.printStackTrace();}finally{
lock.unlock();}}}
List
packagejuc;importjava.util.List;importjava.util.UUID;importjava.util.concurrent.CopyOnWriteArrayList;publicclassListTest{publicstaticvoidmain(String[] args){List<String> list=newCopyOnWriteArrayList<String>();for(int i =0; i <10; i++){newThread(()->{
list.add(UUID.randomUUID().toString().substring(0,5));System.out.println(list);},String.valueOf(i)).start();}}}
Callable
packagejuc;importjava.util.concurrent.Callable;importjava.util.concurrent.ExecutionException;importjava.util.concurrent.FutureTask;publicclassCallableTest{publicstaticvoidmain(String[] args){MyThread myThread=newMyThread();FutureTask<Integer> futureTask=newFutureTask<Integer>(myThread);newThread(futureTask,"A").start();//结果会被缓存try{Integer t=futureTask.get();System.out.println(t);}catch(InterruptedException e){// TODO Auto-generated catch block
e.printStackTrace();}catch(ExecutionException e){// TODO Auto-generated catch block
e.printStackTrace();}}}classMyThreadimplementsCallable<Integer>{publicIntegercall(){System.out.println("call");return1024;}}
CountDownLatch
packagejuc;importjava.util.concurrent.CountDownLatch;publicclassCountDownLatchDemo{publicstaticvoidmain(String[] args)throwsInterruptedException{CountDownLatch cLatch=newCountDownLatch(6);for(int i =0; i <6; i++){newThread(()->{System.out.println(Thread.currentThread().getName());
cLatch.countDown();},String.valueOf(i)).start();}
cLatch.await();System.out.println("end");}}
CyclicBarrier
packagejuc;importjava.util.concurrent.BrokenBarrierException;importjava.util.concurrent.CyclicBarrier;publicclassCyclicBarrierDemo{publicstaticvoidmain(String[] args){CyclicBarrier cBarrier=newCyclicBarrier(7,()->{System.out.println("end");});for(int i =0; i <7; i++){finalint temp=i;newThread(()->{System.out.println(temp);try{
cBarrier.await();}catch(InterruptedException e){// TODO Auto-generated catch block
e.printStackTrace();}catch(BrokenBarrierException e){// TODO Auto-generated catch block
e.printStackTrace();}}).start();}}}
Semaphore
packagejuc;importjava.util.concurrent.Semaphore;importjava.util.concurrent.TimeUnit;publicclassSemaphoreDemo{publicstaticvoidmain(String[] args){Semaphore semaphore=newSemaphore(3);for(int i =0; i <6; i++){newThread(()->{try{
semaphore.acquire();System.out.println(Thread.currentThread().getName()+"in");TimeUnit.SECONDS.sleep(1);System.out.println(Thread.currentThread().getName()+"out");}catch(InterruptedException e){// TODO Auto-generated catch block
e.printStackTrace();}finally{
semaphore.release();}},String.valueOf(i)).start();}}}
synchronizedpackage juc;public class SaleTicketDemo01 { public static void main(String[] args) { Ticket ticket=new Ticket(); new Thread(()->{ for (int i = 0; i < 20; i++) { ticket.sale(); } },"a").start(); new Thread(()->{