【 ¥O。无所谓好与坏 …… 用心了就足够了·】

向孙老师学习java第十二天-线程(二)

上一篇 / 下一篇  2007-12-25 14:28:48 / 个人分类:Java

线程:
1.同步:synchronized.

public class ts{
 public static void main(String[] args){
 tik k=new tik();
 new Thread(ok).start();
 new Thread(ok).start();
 new Thread(ok).start();
 new Thread(ok).start();
 }
}
class tik implements Runnable{
 int t=100;
 public void run(){
  while(true){
  if(t>0){
               try{
     Thread.sleep(10);
    }
    catch(Exception e){
    
     e.printStackTrace();
    }
  System.out.println(Thead.currentThead().getName()+t);
  t--;
   }
  }
 }
}

这段代码使得打出的结果出现负数,原因是因为时间片的缘故。也就是说当t=0的时候,由于睡了10毫秒,但在睡的期间,t=0的时间片轮完了,t=-1就接着来执行,直到t=0醒了执行完它的流程之后才停止循环。因此t就出现了-1,-2这样的情况。
因此,我们用同步synchronized来解决这个问题。同步机制是给定义的对象加一个“锁”,一定要等到循环的上一个执行完它的任务之后,才打开这个“锁”来进行下一步的循环。也就是在t=1执行之前就给对象o加了锁,一定要等t=1醒了执行完它的任务后才能进行t=0的循环,直到循环结束。

package ts;

public class ts {
 public static void main(String[] args) {
  tik k = new tik();
  new Thread(ok).start();
  new Thread(ok).start();
  new Thread(ok).start();
  new Thread(ok).start();
 }
}

class tik implements Runnable {
 int t = 100;
 Object o = new Object();                         //定义一个任意类型的对象

 public void run() {
  while (true) {
   synchronized (o) {               //将要同步的代码段放入synchronized ()中,o是对象
    if (t > 0) {
     try {
      Thread.sleep(10);
     } catch (Exception e) {

      e.printStackTrace();
     }
     System.out.println(Thread.currentThread().getName() + t);
     t--;
    }
   }
  }
 }
}

2.以上是同步块,还有一种同步的方法,就是定义同步方法。

package ts;

public class ts {
 public static void main(String[] args) {
  tik k = new tik();
  new Thread(ok).start();
  new Thread(ok).start();
  new Thread(ok).start();
  new Thread(ok).start();
 }
}

class tik implements Runnable {
 int t = 100;

 public void run() {
  while (true) {
   sell();                  //调用方法
  }
 }

        public synchronized void sell(){               //用关键字synchronized定义方法,同步方法也有锁,它的加锁对象是一个this
               if (t > 0) {
     try {
      Thread.sleep(10);
     } catch (Exception e) {

      e.printStackTrace();
     }
     System.out.println(Thread.currentThread().getName() + t);
     t--;
    }
          }
}

3.两个容易造成死锁的Thead方法--rusume()和suspend()

4.Object方法:wait()和notify(),notifyAll()。一个对象有一个锁外,还有一个等待队列。刚创建一个对象的时候,它的等待队列是空的,应该在锁住一个对象后,调用wait()方法,这个方法要抛出异常。notify()则删去队列中任意一个线程,使之可再运行。他们只能在同步中运用。

5.停止线程:interrupt()


TAG: Java java

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2008-07-18  
  12345
6789101112
13141516171819
20212223242526
2728293031  

数据统计

  • 访问量: 6818
  • 日志数: 55
  • 图片数: 1
  • 建立时间: 2007-01-02
  • 更新时间: 2008-01-03

RSS订阅

Open Toolbar