如何在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:在评论一半已知的内容之前,也要检查一下答案。这不会有帮助,代码在一个线程中迭代列表,在另一个线程中修改列表,我想从列表中删除元素。最好的解决方案是使用并发支持列表,但我相信他必须首先澄清他的需求。这不会有帮助,代码在一个线程中对列表进行迭代,并修改列表,我认为在另一个线程中从列表中删除元素。最好的解决办法是使用一个并发的支持列表,但我相信他必须首先澄清他的需求。