Thread类的解析和常识



Thread的构造方法

public Thread(Runnable runnable);
public Thread(ThreadGroup group ,Runnable runnale);
public Thread(String name)
public Thread(ThreadGroup group ,String name)
public Thread(Runnable runnable,String name)
public Thread(ThreadGroup group,Runnable runnable,String name)

创建一个线程的方法
Thread 本身实现了Runnable接口,所以继承Thread,然后重写run()方法
class myThread extends Thread{

  public void run(){}
}
第二种方法是,创建一个类,实现Runnable接口
class myRunnable implements Runnable{

puhlic void run(){}

}

线程优先级的问题

方法 setPriority(int priority)
priority的值0--10

优先级高的Thread将优先抢占资源进行运行。线程池也可以设置优先级
优先级高的线程池将优先运行,运行完池里的线程再运行其他线程池

线程一般通过sleep()把运行资源让给其他线程

Thread基本控制


1. sleep(int sleeptime)暂停运行指定时间,把运行资源让给其他线程

 2.yield()  把运行资源让给其他具有 相同优先级并且是 可运行的线程,如果
              其他线程不具备上面两个条件,这个方法并没什么卵用。当前线程 将继续运行。

3.join()这个方法是用在一个线程内部,如下面的例子,表示thead1要等待
t线程执行完再执行自己。
join(long millis)thead1最多等待millis时间,然后不管t线程执行完
                              都将再启动自己


4.interrupt()如果一个线程处于阻塞(如调用了sleep(),join(),wait()等),
                         调用该方法后该线程将死掉,抛出InterruptException异常
5.currntThread()返回当前线程的引用。
6.isAlive()返回Thread的状态,true表示还没运行完,false表示运行完或还没开启。



Thread thread1=new Thread(

new Runnable(){

public void run(){

t.join();

}

}

);



  对象锁及其操作

java用语句synchronied(Object){}语句为Oject对象设置一个锁。
只有拥有这个锁的线程才能操作这个对象中的临界区。
临界区是由sychronized语句包含的语句块或方法。


(1)关于对象锁的返还
       。当sychronized语句块窒执行完毕
       。sychronized语句块出现异常
       。持有锁的线程调用了wait()方法
    
(2)共享数据的访问都必须设置临界区。
        如果设置在非临界区的语句中,线程就可以在不持有锁的情况下访问
      无法保证数据的同步

  
  (3)用sychronized语句保护的共享数据必须是私有的。
          作用也是同2.如果把共享数据设置为public,不用
         通过临界区就可以访问到该数据,也无法保证数据同步。

      (4)线程获得对象的锁后,可以访问对象内的任意临界区。

        

死锁问题及解决方案
 
   有对象OBJ1,OBJ2,有线程Thread1,Thread2.一开始thread1占用了obj1的锁,
  thread2占用了obj2的锁。然后thead1又想去调用obj2的资源,而恰巧thead2也想
去调用obj1的资源,这样他们就要使用的资源都被相互占用着,这样就一直相互等下去。

   wait()和notify()方法。

     这两个方法是Object的方法。object调用wait()后,持有这个object的锁的线程将
释放锁,进入这个对象的等待池中。object调用notify()方法后,object对象等待池中
的线程将激活,重新持有该对象的锁。


public class producer implements Runnable{
 
 
 private String name;
 
 private GoodsWarehouse house;
 
 
 public producer(String name,GoodsWarehouse h) {
 
 
  this.name=name;
 
  house=h;
 
 }
 
 @Override
 public void run() {
 
  for(int i=0;i<20;i++)
  {
   
   house.produceGoods();
   
   System.out.print(name);
   
  }
 
    
 System.out.println("停产中。。。。");
   
 }
 
}






public class consumer implements Runnable{
 
 
 private String name;
 
 private GoodsWarehouse warehouse;
 
 public consumer(String n,GoodsWarehouse house) {
 
  warehouse=house;
 
 
 name=n;
 
 
 }
 
 public void run() {
 
 
  for(int i=0;i<20;i++){
   
   warehouse.consumeGoods();
   System.out.print(name);
   
 
   try {
    Thread.sleep(100);
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   
  }
 
 
 
 
 
  System.out.println("停售中。。。");
 
 
 };
}





public class GoodsWarehouse {
private int leftGoods=100;
public synchronized void produceGoods(){
 
 if (leftGoods>100) {
 
  try {
   
   System.out.println("生产过剩,待消费中。。。。");
   
   
   notifyAll();
   
   wait();
   
 
   
   
  } catch (InterruptedException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 
 
 
 }else {
 
 
 
  leftGoods+=100;
 
  System.out.println("生产100个,仓库中剩余"+leftGoods);
 
 }
}
 
 
public synchronized void consumeGoods(){
 
 if (leftGoods<60) {
 
  System.out.println("仓储不足,待产中。。。。");
 
  try {
   
   notifyAll();
   
   this.wait();
   
   
   
  } catch (InterruptedException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 
 }else {
 
  leftGoods-=40;
 
  System.out.println("消费40,还剩余"+leftGoods);
 
 }
 
 
}






  




public static void main(String[] args) {
 
 
  GoodsWarehouse h=new GoodsWarehouse();
 
  Thread consumer=new Thread(new consumer("consumer1", h));
 
  Thread producer=new Thread(new producer("producer1", h));
 
  consumer.start();
 
  producer.start();
 
 
 
 }















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值