Java 线程和同步

Java 线程和同步,java,eclipse,thread-synchronization,Java,Eclipse,Thread Synchronization,我需要为以下内容创建一个java程序: 创建一个ArrayList来存储员工的姓名 创建两个同步方法,将员工姓名添加到ArrayList并打印员工姓名 两个线程完成添加员工后,打印员工姓名 我已经做了以下操作,但它不起作用。它在“pr.print(X)”行出现异常。有人能帮忙吗?这不是我的作业!!!我只是在努力学习 import java.util.*; public class Ch5Ex2 { public static void main(String[] args) {

我需要为以下内容创建一个java程序:

  • 创建一个ArrayList来存储员工的姓名
  • 创建两个同步方法,将员工姓名添加到ArrayList并打印员工姓名
  • 两个线程完成添加员工后,打印员工姓名
  • 我已经做了以下操作,但它不起作用。它在“pr.print(X)”行出现异常。有人能帮忙吗?这不是我的作业!!!我只是在努力学习

    import java.util.*;
    
    public class Ch5Ex2 
     {
      public static void main(String[] args) 
       {
        List<String> li = new ArrayList<String>();
        Print pri = new Print();
        pri.start();
        Insert in = new Insert(li);
        in.start();
       }
    }   
    
    class Insert extends Thread
    {
     Print pr = new Print();
     List<String> x;
     public Insert(List<String> x)
      {
        this.x = x;
      }
    
    public synchronized void run()
     {
        try
        {
          x.add("robin");
          x.add("ravi");
          x.add("raj");
          pr.print(x);
        }
        catch(Exception e)
         {
            e.printStackTrace();
         }
     }
    
    }
    
    class Print extends Thread
    {
     List<String> y;
    public void print(List<String> y)
     {
        this.y = y;
        notify();
     }
    
    public synchronized void run()
     {
        try
        {
         wait();
         for(int i=0;i<y.size();i++)
          {
             System.out.println(y.get(i));
          }
         }
        catch(Exception e)
        {
            e.printStackTrace();
        }
     }
    }   
    
    import java.util.*;
    公共类Ch5Ex2
    {
    公共静态void main(字符串[]args)
    {
    List li=new ArrayList();
    打印优先级=新打印();
    pri.start();
    插入=新插入(li);
    in.start();
    }
    }   
    类插入扩展线程
    {
    打印pr=新打印();
    清单十;
    公共插入(列表x)
    {
    这个.x=x;
    }
    公共同步的无效运行()
    {
    尝试
    {
    x、 添加(“罗宾”);
    x、 添加(“ravi”);
    x、 添加(“raj”);
    公共印刷品(x);
    }
    捕获(例外e)
    {
    e、 printStackTrace();
    }
    }
    }
    类打印扩展线程
    {
    列表y;
    公共作废打印(列表y)
    {
    这个。y=y;
    通知();
    }
    公共同步的无效运行()
    {
    尝试
    {
    等待();
    
    对于(int i=0;i我猜
    pr
    Insert
    类中为空,您永远不会调用构造函数。

    我猜
    pr
    Insert
    类中为空,您永远不会调用构造函数。

    为了让您的生活更轻松,您可能会忘记应用程序级别的同步,只需通过c创建同步的
    ArrayList
    所有到
    集合#synchronizedList()
    如下

    List yourArray=Collections.synchronizedList(新的ArrayList())

    在这种情况下,来自不同线程的对
    yourArray
    的所有调用都将同步。
    除此之外,
    pr
    看起来是空的,因为你从来没有实例化过它(多亏了尼古拉·库兹涅佐夫)。

    为了让你的生活更轻松,你可能会忘记应用程序级的同步,只需通过调用
    集合#synchronizedList()
    创建同步化的
    ArrayList

    List yourArray=Collections.synchronizedList(新的ArrayList())

    在这种情况下,来自不同线程的对
    yourArray
    的所有调用都将同步。
    除此之外,
    pr
    看起来是空的,因为你从来没有实例化过它(多亏了尼古拉·库兹涅佐夫).

    您没有为pr分配内存。您只是创建了一个可变打印pr。因此,您必须获得NPE

    您没有为pr分配内存。您只是创建了一个可变打印pr。因此,您必须获得NPE

    我认为您需要:

    import java.util.*;
    
    public class Ch5Ex2 {
        public static void main(String[] args) {
            List<String> li = new ArrayList<String>();
            Print pri = new Print();
            pri.start();
            Insert in = new Insert(li, pri);
            in.start();
        }
    }
    
    
    class Insert extends Thread {
        Print pr;
        List<String> x;
        public Insert(List<String> x, Print p) {
            this.x = x;
            pr = p;
        }
    
        public synchronized void run() {
            try{
                x.add("robin");
                x.add("ravi");
                x.add("raj");
                pr.print(x);
            } catch(Exception e) {
                e.printStackTrace();
            }
        }
    }
    
    class Print extends Thread {
        List<String> y;
        public synchronized void print(List<String> y) {
            this.y = y;
            notify();
        }
    
        public synchronized void run() {
            try {
                while(y == null){
                    wait();
                }
                for(int i=0;i<y.size();i++) {
                    System.out.println(y.get(i));
                }
            } catch(Exception e) {
                e.printStackTrace();
            }
        }
    }
    
    import java.util.*;
    公共类Ch5Ex2{
    公共静态void main(字符串[]args){
    List li=new ArrayList();
    打印优先级=新打印();
    pri.start();
    插入=新插入(li,pri);
    in.start();
    }
    }
    类插入扩展线程{
    印刷公关;
    清单十;
    公共插入(列表x,打印p){
    这个.x=x;
    pr=p;
    }
    公共同步的无效运行(){
    试一试{
    x、 添加(“罗宾”);
    x、 添加(“ravi”);
    x、 添加(“raj”);
    公共印刷品(x);
    }捕获(例外e){
    e、 printStackTrace();
    }
    }
    }
    类打印扩展线程{
    列表y;
    公共同步作废打印(列表y){
    这个。y=y;
    通知();
    }
    公共同步的无效运行(){
    试一试{
    while(y==null){
    等待();
    }
    对于(int i=0;i我认为您需要:

    import java.util.*;
    
    public class Ch5Ex2 {
        public static void main(String[] args) {
            List<String> li = new ArrayList<String>();
            Print pri = new Print();
            pri.start();
            Insert in = new Insert(li, pri);
            in.start();
        }
    }
    
    
    class Insert extends Thread {
        Print pr;
        List<String> x;
        public Insert(List<String> x, Print p) {
            this.x = x;
            pr = p;
        }
    
        public synchronized void run() {
            try{
                x.add("robin");
                x.add("ravi");
                x.add("raj");
                pr.print(x);
            } catch(Exception e) {
                e.printStackTrace();
            }
        }
    }
    
    class Print extends Thread {
        List<String> y;
        public synchronized void print(List<String> y) {
            this.y = y;
            notify();
        }
    
        public synchronized void run() {
            try {
                while(y == null){
                    wait();
                }
                for(int i=0;i<y.size();i++) {
                    System.out.println(y.get(i));
                }
            } catch(Exception e) {
                e.printStackTrace();
            }
        }
    }
    
    import java.util.*;
    公共类Ch5Ex2{
    公共静态void main(字符串[]args){
    List li=new ArrayList();
    打印优先级=新打印();
    pri.start();
    插入=新插入(li,pri);
    in.start();
    }
    }
    类插入扩展线程{
    印刷公关;
    清单十;
    公共插入(列表x,打印p){
    这个.x=x;
    pr=p;
    }
    公共同步的无效运行(){
    试一试{
    x、 添加(“罗宾”);
    x、 添加(“ravi”);
    x、 添加(“raj”);
    公共印刷品(x);
    }捕获(例外e){
    e、 printStackTrace();
    }
    }
    }
    类打印扩展线程{
    列表y;
    公共同步作废打印(列表y){
    这个。y=y;
    通知();
    }
    公共同步的无效运行(){
    试一试{
    while(y==null){
    等待();
    }
    
    对于(int i=0;iI现在实例化了pr,但它没有打印任何东西。我现在实例化了pr,但它没有打印任何东西。为什么我在做了所有事情后只是问一个小问题,而我的帖子却被投了反对票?@NikolayKuznetsov我实例化了pr,但现在它没有打印任何东西。我没有投反对票,但NPE会准确地告诉我这句话是什么意思发生这种情况时,你可以很容易地解决它,相反,你在这里转储代码。@NikolayKuznetsov我说我按照你的要求实例化了pr。我不再得到NPE,但也没有得到输出。我只是在寻求帮助。为什么我在做了所有事情后只问一个小问题时,我的帖子会得到反对票?@NikolayKuznetsov我实例化了pr,但现在它没有打印任何东西。我没有否决投票,但NPE会准确地告诉它发生在哪一行,所以你可以很容易地解决它,相反,你在这里转储代码。@NikolayKuznetsov我说我按照你的要求实例化了pr。我不再得到NPE,但也没有得到输出。我只是问一下正在查找帮助。您是否尝试运行上述代码?请再试几次。此外,这不是正确的解决方案,但如果在插入线程之前启动打印线程,则该解决方案必须有效。我正在获取输出。好的,我在删除等待和通知时获得了答案…我将找到正确放置它们的位置,然后查看是否仍然获得答案…谢谢:)你试过运行上面的代码吗?再试几次..这也是