写2个线程,其中一个线程打印1~52,另一个线程打印A~Z,打印顺序应该是12A34B56C...5152Z

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
发布了29 篇原创文章 · 获赞 10 · 访问量 7480

猜你喜欢

转载自blog.csdn.net/qmqm33/article/details/103948238