1、写两个线程,一个线程打印数字,一个线程打印字母,且交替打印,打结果为:A12B34C56D78E910F1112G1314H1516I1718J1920K2122L2324M2526N2728O2930P3132Q3334R3536S3738T3940U4142V4344W4546X4748Y4950Z5152
代码如下:
锁控制实体类Suo:

public class Suo { 

public boolean charIsDo=false;//主要用于先执行线程1,先打字母 

public boolean isCharIsDo() { 

return charIsDo; 

} 

public void setCharIsDo(boolean charIsDo) { 

this.charIsDo = charIsDo; 

} 

 }
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.


线程1:

public class ThreadTest1 implements Runnable{ 

private Suo suo; 

public int currentIndex=0; 

 

public ThreadTest1(){ 

} 

public ThreadTest1(Suo suo){ 

this.suo=suo; 

} 

 

@Override 

public void run() { 

synchronized(suo) { 

while(true){ 

if(currentIndex>=26){ 

suo.notify();//中断本线程前要通知其它线 

break;//中断,退出此线程 

} 

System.out.print((char)(currentIndex+65)); 

currentIndex++; 

suo.setCharIsDo(true); 

try { 

suo.notify(); 

suo.wait(); 

} catch (InterruptedException e) { 

e.printStackTrace(); 

} 

} 

} 

} 

 }
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.


线程2:

public class ThreadTest2 implements Runnable{ 

private Suo suo; 

public int currentIndex=0; 

 

public ThreadTest2(){ 

} 

public ThreadTest2(Suo suo){ 

this.suo=suo; 

} 

 

public void run() { 

synchronized(suo) { 

while(true){ 

if(!suo.isCharIsDo()){//优先打字母 

try { 

suo.notify(); 

suo.wait(); 

} catch (InterruptedException e) { 

e.printStackTrace(); 

} 

} 

 

if(currentIndex>=52){ 

suo.notify();//中断本线程前要通知其它线程 

break;//中断,退出此线程 

} 

currentIndex++; 

System.out.print(currentIndex); 

currentIndex++; 

System.out.print(currentIndex); 

try { 

suo.notify(); 

suo.wait(); 

} catch (InterruptedException e) { 

e.printStackTrace(); 

} 

} 

} 

} 

 }
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.


测试Main方法代码:

public class Main { 

public static void main(String[] args) { 

Suo suo = new Suo();//锁 

ThreadTest1 test1=new ThreadTest1(suo); 

ThreadTest2 test2=new ThreadTest2(suo); 

Thread thead1=new Thread(test1); 

thead1.start(); 

Thread thead2=new Thread(test2); 

thead2.start(); 

} 
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.


2、实际开发中,我们不是将整个对象锁住了,其他线程想要执行这个类中的其它用Synchronized方法声明的方法都不可以了,因为想要进入其它的synchronized


方法也要先获得这个对象的锁,所以这种方法比较霸道,我们不建议这么做,所以出现了第二种方法,添加临时对象锁,就是针对每个synchronized方法,都有一个临时对象Object,如下面的代码

线程代码


public class ThreadTest implements Runnable { 

    private int cur=0; 


public void run() { 

this.printTest(); 

} 


Object lock=new Object();//临时变量锁 

public void printTest(){ 

synchronized (lock) { 

while(true){ 

if(cur>20){ 

lock.notify(); 

break; 

} 

Thread currentThread=Thread.currentThread(); 

System.out.println(currentThread.getName()+":"+cur++); 

try { 

lock.notify(); 

lock.wait(); 

} catch (InterruptedException e) { 

e.printStackTrace(); 

} 

} 

} 

} 

 }
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.

测试代码:



public class Main { 

public static void main(String args[]){ 

ThreadTest thread1 = new ThreadTest(); 

Thread t1= new Thread(thread1); 

Thread t2= new Thread(thread1); 

t1.start(); 

t2.start(); 

} 

 }
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.