java线程相关问题1

一.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

结论:一个锁住的方法,别的对象或线程可以读取里面的或在里面修改的值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值