一.Thread.sleep();
1.Thread.Sleep(XXXX)函数就是干这种事的,他告诉操作系统“在未来的多少毫秒内我不参与CPU竞争”。
2.而Thread.Sleep(0)的作用,就是“触发操作系统立刻重新进行一次CPU竞争”。
竞争 的结果也许是当前线程仍然获得CPU控制权,也许会换成别的线程获得CPU控制权。这也是我们在大循环里面经
常 会写一句Thread.Sleep(0) ,因为这样就给了其他线程比如Paint线程获得CPU控制权的权力,这样界面就不会假死在那里。
二,synchronized 的注意点
例子1、
package line;
public class lineProject implements Runnable{
private int num=10;
public synchronized void doit()
{
if(num>0)
{
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+":tickets"+--num);
}
}
public void run()
{
while(true)
{
doit();
}
}
public static void main(String[] args) {
lineProject t=new lineProject();
Thread tA=new Thread(t);
Thread tB=new Thread(t);
Thread tC=new Thread(t);
tA.start();
tB.start();
tC.start();
}
}
运行结果
Thread-0:tickets9
Thread-0:tickets8
Thread-0:tickets7
Thread-0:tickets6
Thread-0:tickets5
Thread-0:tickets4
Thread-2:tickets3
Thread-2:tickets2
Thread-2:tickets1
Thread-2:tickets0
结论1:synthronized修饰方法
例子2:
package line;
public class linequicker implements Runnable {
private int num=10;
public static void main(String[] args) {
linequicker q=new linequicker();
Thread q1=new Thread(q);
Thread q2=new Thread(q);
Thread q3=new Thread(q);
q1.start();
q2.start();
q3.start();
}
@Override
public void run() {
while(true)
{
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
synchronized(this){
if(num>0)
{
System.out.println(Thread.currentThread().getName()+"正在卖第:"+(10-num)+"张票");
num--;
}
else{
break;
}
}
}
}
}
运行结果:Thread-1正在卖第:0张票
Thread-2正在卖第:1张票
Thread-1正在卖第:2张票
Thread-0正在卖第:3张票
Thread-2正在卖第:4张票
Thread-1正在卖第:5张票
Thread-1正在卖第:6张票
Thread-2正在卖第:7张票
Thread-0正在卖第:8张票
Thread-1正在卖第:9张票
总结:synchonized(this){}:在同一时间对于{}内的代码,只有一个线程处于运行状态
当一个线程访问对象的一个synchononized(this)同步代码时,另一个线程可以访问该object的其他非synchronized(this)同步代码块
当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对该object的所有其他synchronized(this)同步代码块访问也被阻塞。
例子3:
package line;
public class lineMore implements Runnable{
int b=100;
public void run()
{
m2();
}
public synchronized void m2()
{
b=1000;
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("b="+b);
}
public void m1()
{
System.out.println(b);
}
public static void main(String[] args) {
lineMore m=new lineMore();
Thread ma=new Thread(m);
ma.start();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
m.m1();
}
}
运行结果:1000
b=1000
结论:一个锁住的方法,别的对象或线程可以读取里面的或在里面修改的值