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