11 多线程

    xiaoxiao2021-03-25  55

    题目:两个线程,其中一个线程完成对某个对象的int值++操作,另一个线程对该对象的int类型--操作,同时要保证该对象的值不会小于0,不会大于1,该值初始化值为0.

    结果为 01010101010101010101……

    package com.test; public class ThreadTest { private int number = 0; public synchronized void jia() throws InterruptedException { if (number != 0) { wait(); } number++; System.out.println("jia:"+number); notify(); } public synchronized void jian() throws InterruptedException { if (number == 0) { wait(); } number--; System.out.println("jian:"+number); notify(); } public static void main(String[] args) { ThreadTest tt = new ThreadTest(); Producer p = new Producer(tt); Consumer c = new Consumer(tt); p.start(); c.start(); } } class Producer extends Thread{ ThreadTest tt; public Producer(ThreadTest tt) { this.tt=tt; } @Override public void run() { while(true){ try { tt.jia(); } catch (InterruptedException e) { e.printStackTrace(); } } } } class Consumer extends Thread{ ThreadTest tt; public Consumer(ThreadTest tt) { this.tt=tt; } @Override public void run() { while(true){ try { tt.jian(); } catch (InterruptedException e) { e.printStackTrace(); } } } } 输出结果为

    jian:0

    jia:1

    jian:0

    jia:1

    jian:0

    jia:1

    jian:0

    jia:1

    jian:0

    加启动两个线程,减启动两个线程?

    private int number = 0; public synchronized void jia() throws InterruptedException { while (number != 0) { wait(); } number++; System.out.println(Thread.currentThread().getName()+ " jia:"+number); notify();; } public synchronized void jian() throws InterruptedException { while (number == 0) { wait(); } number--; System.out.println(Thread.currentThread().getName()+ " jian:"+number); notify(); }

    改成while的话有可能会造成死锁,解决办法为把notify改为notifyAll方法调用。

    关于wait,notify,notifyAll以及sleep方法的关系(重点)

    (1,如果一个线程调用了某个对象的wait方法,那么该线程首先必须要拥有该对象的锁。(一个线程调用了某个对象的wait方法,那么该wait必须在synchronized中)

    (2,如果一个线程调用了某个对象的wait方法,那么该线程就会释放该对象的锁。

    (3,在java对象中,有两种池(锁池,等待池)

    (4,如果一个线程调用了某个对象的wait方法,那么该线程进入该对象的等待池中(释放锁)如果未来某一时刻,另外一个线程调用了该对象的notify或者notifyAll方法,那么在该等待池中的等待的线程就会进入该对象的锁池中,去等待该对象的锁,如果或得锁成功后,那么该线程将继续沿着wait方法之后的路径去执行。

    (5,sleep 睡眠,不释放锁

    转载请注明原文地址: https://ju.6miu.com/read-37351.html

    最新回复(0)