如何在java中使用线程

如何在java中使用线程,java,multithreading,Java,Multithreading,假设一个类中有三个方法,如下所示,我需要一个接一个地调用每个方法,但由于每个方法都在单独的线程上运行,因此会出现错误,请告诉我如何调用以下每个方法: ..... methodOne(); methodTwo(); methodTree(); ..... public Class Test{ public void methodOne(){ new Thread(new Runnable(){ @Override public void run

假设一个类中有三个方法,如下所示,我需要一个接一个地调用每个方法,但由于每个方法都在单独的线程上运行,因此会出现错误,请告诉我如何调用以下每个方法:

.....
methodOne();
methodTwo();
methodTree();
.....

public Class Test{

public void methodOne(){

    new Thread(new Runnable(){
        @Override
            public void run() {
            .....
        }
    }).start();

}

public void methodTwo(){

    new Thread(new Runnable(){
        @Override
            public void run() {
            .....
        }
    }).start();

}


public void methodThree(){

    new Thread(new Runnable(){
        @Override
            public void run() {
            .....
        }
    }).start();

}

}
我发现以下错误

java.util.ConcurrentModificationException
        at java.util.LinkedList$ListItr.checkForComodification(LinkedList.java:778)
        at java.util.LinkedList$ListItr.next(LinkedList.java:713)
        at Manufacturing.MonthEnd.FinishMonth.fillPreviousMonthBalanceRec(FinishMonth.java:141)
        at Manufacturing.MonthEnd.FinishMonth.closeMonth(FinishMonth.java:52)
        at Manufacturing.MonthControllerView.btnCloseMonthActionPerformed(MonthControllerView.java:588)
        at Manufacturing.MonthControllerView.access$400(MonthControllerView.java:28)
        at Manufacturing.MonthControllerView$6.actionPerformed(MonthControllerView.java:465)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2012)
        at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2335)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:404)
        at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:253)
        at java.awt.Component.processMouseEvent(Component.java:6203)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
        at java.awt.Component.processEvent(Component.java:5968)
        at java.awt.Container.processEvent(Container.java:2105)
        at java.awt.Component.dispatchEventImpl(Component.java:4564)
        at java.awt.Container.dispatchEventImpl(Container.java:2163)
        at java.awt.Component.dispatchEvent(Component.java:4390)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4461)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4125)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4055)
        at java.awt.Container.dispatchEventImpl(Container.java:2149)
        at java.awt.Window.dispatchEventImpl(Window.java:2478)
        at java.awt.Component.dispatchEvent(Component.java:4390)
        at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:649)
        at java.awt.EventQueue.access$000(EventQueue.java:96)
        at java.awt.EventQueue$1.run(EventQueue.java:608)
        at java.awt.EventQueue$1.run(EventQueue.java:606)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:105)
        at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:116)
        at java.awt.EventQueue$2.run(EventQueue.java:622)
        at java.awt.EventQueue$2.run(EventQueue.java:620)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:105)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:619)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:275)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:200)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:190)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:185)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:177)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:138)

如果需要一个接一个地调用它们,为什么需要单独的线程?它们不能在同一个主线程中运行吗?

如果需要一个接一个地调用它们,为什么需要单独的线程?它们不能在同一台主机上运行吗?

您可以使用

new Thread().join();
并等待前一个线程死亡。 然后调用下一个方法

您的错误意味着某些线程修改列表对象,而另一个线程同时对其进行迭代。所以,当列表的内容发生变化时,线程无法遍历该列表。您应该使用同步块代码,例如:

List listeners;
...
synchronized(listeners){
    for(Object o : listeners){

    }
}
你可以使用这个方法

new Thread().join();
并等待前一个线程死亡。 然后调用下一个方法

您的错误意味着某些线程修改列表对象,而另一个线程同时对其进行迭代。所以,当列表的内容发生变化时,线程无法遍历该列表。您应该使用同步块代码,例如:

List listeners;
...
synchronized(listeners){
    for(Object o : listeners){

    }
}
有一个LinkedList实例正在从不同的线程访问和修改

快速修复方法是为列表添加私有setter和getter,将它们标记为synchronized,并仅使用这些synchronized方法访问列表。

有一个LinkedList实例正在从不同线程访问和修改


快速修复方法是为列表添加私有setter和getter,将它们标记为synchronized,并仅使用这些synchronized方法访问列表。

测试它是否正常工作

public class ThreadTest
{
    public static void main(String... args)
    {
        Test t = new Test();
        t.methodOne();
        t.methodTwo();
        t.methodThree();
    }
}

class Test
{

    public void methodOne()
    {
        new Thread(new Runnable()
        {
            @Override
            public void run() 
            {
                System.out.println("I AM A THREAD FROM METHOD ONE.");
            }
        }).start();
    }

    public void methodTwo()
    {
        new Thread(new Runnable()
        {
            @Override
            public void run() 
            {
                System.out.println("I AM A THREAD FROM METHOD TWO.");
            }
        }).start();
    }


    public void methodThree()
    {
        new Thread(new Runnable()
        {
            @Override
            public void run() 
            {
                System.out.println("I AM A THREAD FROM METHOD THREE.");
            }
        }).start();
    }

}
对于已发布的stackTrace,当您尝试在集合上迭代,同时尝试修改其值时,会出现此错误。为了修改这些值,请始终使用迭代器,并且还需要同步线程,以便在任何给定时间都不会有两个线程修改同一个集合对象


请注意,Iterator.remove是在迭代期间修改集合的唯一安全方法;如果在迭代过程中以任何其他方式修改了基础集合,则该行为是未指定的。

测试它是否正常工作

public class ThreadTest
{
    public static void main(String... args)
    {
        Test t = new Test();
        t.methodOne();
        t.methodTwo();
        t.methodThree();
    }
}

class Test
{

    public void methodOne()
    {
        new Thread(new Runnable()
        {
            @Override
            public void run() 
            {
                System.out.println("I AM A THREAD FROM METHOD ONE.");
            }
        }).start();
    }

    public void methodTwo()
    {
        new Thread(new Runnable()
        {
            @Override
            public void run() 
            {
                System.out.println("I AM A THREAD FROM METHOD TWO.");
            }
        }).start();
    }


    public void methodThree()
    {
        new Thread(new Runnable()
        {
            @Override
            public void run() 
            {
                System.out.println("I AM A THREAD FROM METHOD THREE.");
            }
        }).start();
    }

}
对于已发布的stackTrace,当您尝试在集合上迭代,同时尝试修改其值时,会出现此错误。为了修改这些值,请始终使用迭代器,并且还需要同步线程,以便在任何给定时间都不会有两个线程修改同一个集合对象


请注意,Iterator.remove是在迭代期间修改集合的唯一安全方法;如果在迭代过程中以任何其他方式修改了基础集合,则该行为未指定。

在编码之前,每个人都应明确自己的需要!你自己弄清楚你需要什么?您需要顺序执行还是并发执行? 之后,根据您的需要查看您拥有的工具。
如果需要并发访问,只需查看java.util.concurrent包。有一些很好的课程可以帮助您完成这项工作。

在编写代码之前,每个人都应该明确自己的需求!你自己弄清楚你需要什么?您需要顺序执行还是并发执行? 之后,根据您的需要查看您拥有的工具。
如果需要并发访问,只需查看java.util.concurrent包。有一些很好的课程可以帮助您解决这个问题。

您会遇到哪些错误?你能在你的问题上发布stacktrace/异常吗?你会遇到什么错误?你能在你的问题上发布stacktrace/异常吗?我对每个方法的任务都有单独的进度条,这是我必须使用单独线程的情况。我对每个方法的任务都有单独的进度条,这是我必须使用单独线程的情况。很明显,这是一个打字错误!看看stacktrace。@AmirPashazadeh:在评论一半已知的东西之前,也要检查一下答案。很明显,这是一个打字错误!看看stacktrace。@AmirPashazadeh:在评论一半已知的内容之前,也要检查一下答案。这不会有帮助,代码在一个线程中迭代列表,在另一个线程中修改列表,我想从列表中删除元素。最好的解决方案是使用并发支持列表,但我相信他必须首先澄清他的需求。这不会有帮助,代码在一个线程中对列表进行迭代,并修改列表,我认为在另一个线程中从列表中删除元素。最好的解决办法是使用一个并发的支持列表,但我相信他必须首先澄清他的需求。