多线程详解,同步,死锁,等待-通知

来源:互联网 发布:墙面网络面板用a还是b 编辑:程序博客网 时间:2024/06/06 02:44

1.多线程的两种实现--class A extends Thread,class B implements Runnable---对应的两种启动方法分别是A a = new A();a.start();---B b = new B();new Tread(b).start();

两种方法都要实现public void run() {};

2.几个函数,

 longgetId()
          返回该线程的标识符。 StringgetName()
          返回该线程的名称。 intgetPriority()
          返回线程的优先级。

3.线程安全

使用关键字synchronized,有两种同步形式分别是同步方法也同步块。

4.线程死锁,

代码示例:

class MultiThread {
    public static void main(String[] args) {
        SellThread st = new SellThread();
        new Thread(st).start();
        try {
            Thread.sleep(1);
        }
        catch(Exception e) {
            e.printStackTrace();
        }
        st.b = true;
        new Thread(st).start();
        //new Thread(st).start();
        //new Thread(st).start();
       
       
    }
   
   
}
class SellThread implements Runnable {
   
    int tickets = 100;
    boolean b = false;
    Object obj = new Object();
    public void run() {
        if(b == false) {
            while(true) {
                sell();
            }
        }
        while(true) {
            synchronized(obj) {//obj----this
                try {
                            Thread.sleep(10);
                }
                catch(Exception e) {
                    e.printStackTrace();
                }
                synchronized(this) {   
                    if(tickets>0) {
                        System.out.println("obj" + Thread.currentThread().getName() + "sell tickets:" + tickets);   
                        tickets--;
                    }
                }
            }
            sell();
        }   
    }
    public synchronized void sell() {
        if(tickets>0) {
                synchronized(obj) {
                    try {
                            Thread.sleep(10);
                    }
                    catch(Exception e) {
                        e.printStackTrace();
                    }
                    System.out.println("this" + Thread.currentThread().getName() + "sell tickets:" + tickets);   
                    tickets--;
                }
        }
    }
}

 

 

上面两个线程互相等待各自的锁所以会出现死锁现象

5.wait() 与 notify();

代码示例:

class Test {
    public static void main(String[] args) {
            Queue q = new Queue();
            Producer p = new Producer(q);
            Consumer c = new Consumer(q);
            p.start();
            c.start();
    }   
   
}
class Producer extends Thread {
    Queue q;
    Producer(Queue q) {
        this.q = q;   
    }   
    public void run() {
        for(int i=0;i<10;i++) {
            q.put(i);
            System.out.println("Producer put" + i);   
        }   
    }
}

class Consumer extends Thread {
    Queue q;
    Consumer(Queue q) {
        this.q = q;   
    }   
    public void run() {
        while(true) {
            System.out.println("Consumer:" + q.get());
        }
               
    }
}
class Queue {
    int value;
    boolean b = false;
    public synchronized void put(int i) {
        if(b == false) {
            value = i;   
            b = true;
            notify();
        }
        try{
            wait();
        }
        catch(Exception e) {
            e.printStackTrace();
        }
    }   
    public synchronized int get() {
        if(b == false) {
            try {
                wait();
            }
            catch(Exception e) {
                e.printStackTrace();
            }
        }
        b = false;
        notify();   
        return value;
       
    }
   
}

 

 

 

 

 

 

 

原创粉丝点击