synchronized和sleep()
这是疯狂讲义多线程上的题目。
我们之前写的多线程,他都是随机分配的,那么如果解决这个,首先带大家了解一下synchronized
synchronized概念
- synchronized 是 Java 中的关键字,是利用锁的机制来实现同步的。
锁机制有如下两种特性:互斥性和可见性 
再这个题目中,我们用到了获取对象锁,在这里我用的是synchronized 修饰非静态方法
需要思考的问题
- 为什么要使用synchronized?
使用synchronized目的是为了使方法内部执行完毕,才能获得启动另外一个资源。 - 为什么用sleep()而不是yield();
yield()是将资源让出,下一个是什么线程操作不一定,而sleep()是让该线程处于休眠状态,将资源让给其他线程进行执行。 
Number类
package com.xiancheng;
public class Number implements Runnable{
	
	@Override
	public void run() {
		// TODO Auto-generated method stub
		number();
	}
	private synchronized void number() {
		// TODO Auto-generated method stub
		for(int i=1;i<53;i++) {
			System.out.print(i);
			System.out.print(++i);
			//如果得到两个值,就使用睡眠函数,将资源让出
			if(i%2==0) {
				try {
					Thread.sleep(50);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
	   }
   }
}
Letter类
这里我把测试也写在了这个类里面
package com.xiancheng;
public class Letter implements Runnable{
	@Override
	public void run() {
		// TODO Auto-generated method stub
		letter();
	}
	private synchronized void letter() {
		// TODO Auto-generated method stub
		//char aLetter='A';
		for(char aLetter='A';aLetter<='Z';aLetter++) {
			try {
				Thread.sleep(50);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			System.out.print(aLetter);
		}
	}
	
	public static void main(String[] args) {
		Thread numbers=new Thread(new Number(),"numbers");
		Thread letters=new Thread(new Letter(),"letters");
		//启动这两个线程
		numbers.start();
		letters.start();
	}
}
测试结果
12A34B56C78D910E1112F1314G1516H1718I1920J2122K2324L2526M2728N2930O3132P3334Q3536R3738S3940T4142U4344V4546W4748X4950Y5152Z
                                    来源:CSDN
作者:AA-Jessica
链接:https://blog.csdn.net/qmqm33/article/details/103948238