西楠 发表于 2020-11-10 19:39

Java作业

    今天的作业题
/*1、使用生产者和消费者模式实现,交替输出:
        假设只有两个线程,输出以下结果:
                t1-->1
                t2-->2
                t1-->3
                t2-->4
                t1-->5
                t2-->6
                ....

                要求:必须交替,并且t1线程负责输出奇数。t2线程负责输出偶数。
                两个线程共享一个数字,每个线程执行时都要对这个数字进行:++
*/
public class Test {
    public static void main(String[] args) {
      Num num=new Num(1);
      Thread t1=new Thread(new OddNumThread(num));
      Thread t2=new Thread(new EvenNumThread(num));
      t1.setName("奇数线程");
      t2.setName("偶数线程");
      t1.start();
      t2.start();
    }
}
class Num{
    private int i;

    public Num() {
    }

    Num(int i) {
      this.i = i;
    }

    public int getI() {
      return i;
    }

    public void setI(int i) {
      this.i = i;
    }
}
class OddNumThread implements Runnable{
    private Num num;

    public OddNumThread() {
    }

    public OddNumThread(Num num) {
      this.num = num;
    }

    public void run() {
      while (true){
            synchronized(num){
                if (num.getI() %2 != 0){
                  System.out.println(Thread.currentThread().getName()+"-->"+num.getI());
                  int i=num.getI();
                  num.setI(++i);
                  num.notify();
                }else {
                  try {
                        num.wait();
                  } catch (InterruptedException e) {
                        e.printStackTrace();
                  }
                }
            }
      }
    }
}
class EvenNumThread implements Runnable{
    private Num num;

    public EvenNumThread() {
    }

    public EvenNumThread(Num num) {
      this.num = num;
    }

    public void run() {
      while (true){
            synchronized(num){
                if (num.getI() %2 == 0){
                  System.out.println(Thread.currentThread().getName()+"-->"+num.getI());
                  int i=num.getI();
                  num.setI(++i);
                  num.notify();
                }else {
                  try {
                        num.wait();
                  } catch (InterruptedException e) {
                        e.printStackTrace();
                  }
                }
            }
      }
    }
}

vsans 发表于 2020-11-11 16:28

dnn 发表于 2020-11-11 16:09
工作中多线程用的不多,但是确实挺重要的

我感觉也看业务吧我们平时工作中用的还是挺多的

166818008 发表于 2020-11-10 20:37

哈哈,最近也在学线程
wait()应该换成sleep(1000);

西楠 发表于 2020-11-10 21:11

166818008 发表于 2020-11-10 20:37
哈哈,最近也在学线程
wait()应该换成sleep(1000);

哈哈,题目就这么要求的,使用生产者和消费者模式实现

166818008 发表于 2020-11-10 21:20

17684047927 发表于 2020-11-10 21:11
哈哈,题目就这么要求的,使用生产者和消费者模式实现{:301_978:}

建议把类分开来放,这样简单易读

西楠 发表于 2020-11-10 21:21

166818008 发表于 2020-11-10 20:37
哈哈,最近也在学线程
wait()应该换成sleep(1000);

老师教的要这样写,我这样写感觉老师都要骂人了{:1_890:}
class OddNumThread implements Runnable{
    private Num num;

    public OddNumThread() {
    }

    public OddNumThread(Num num) {
      this.num = num;
    }

    public void run() {
      while (true){
            synchronized(num){
                if (num.getI() %2 == 0){
                  try {
                        num.wait();
                  } catch (InterruptedException e) {
                        e.printStackTrace();
                  }
                }
                System.out.println(Thread.currentThread().getName()+"-->"+num.getI());
                int i=num.getI();
                num.setI(++i);
                num.notify();
            }
      }
    }
}

西楠 发表于 2020-11-10 21:24

166818008 发表于 2020-11-10 21:20
建议把类分开来放,这样简单易读

写一个文件里写习惯了,哈哈。慢慢改过来

166818008 发表于 2020-11-10 21:27

17684047927 发表于 2020-11-10 21:21
老师教的要这样写,我这样写感觉老师都要骂人了
class OddNumThread i ...

写给自己看当然可以,不过要养成好习惯,后面做项目时,避免代码杂乱

zydf 发表于 2020-11-11 13:52

当时学多线程可给我绕晕了

oXid 发表于 2020-12-12 15:18

共享资源分配,同步
页: [1]
查看完整版本: Java作业