草庐IT

Tread多线程

全部标签

java - ExecutorService,如何在不阻塞主线程的情况下知道所有线程何时完成?

我有一个多线程实现,我在其中创建一个ExecutorService并提交要执行的任务,我想知道所有线程何时提交都已完成而不阻塞主线程和UI。我试过ExecutorService.awaitTermination()但它会阻塞主线程和UI。我搜索了很多,但我似乎无法找到一种优雅的方式来做到这一点。我目前正在考虑创建另一个线程来计算已完成线程的数量并在它们全部完成时启动一个事件,但这不是一个好方法,我想要一个更好的解决方案! 最佳答案 使用SwingWorker关闭线程池并调用awaitTermination()。这将防止UI阻塞并从您

java - 实现线程安全共享计数器的功能方法

我是Scala和函数式编程的新手,我喜欢使用不可变对象(immutable对象)可以避免许多线程安全陷阱的想法。一件事仍然困扰着我,它就是用来教授线程安全的经典示例——共享计数器。我想知道是否有可能实现一个线程安全的计数器(在这个例子中是一个请求计数器),使用不可变对象(immutable对象)和函数概念,并完全避免同步。因此,这里首先是计数器的经典可变版本供引用(请原谅公共(public)成员变量,只是为了示例的简洁)可变的,非线程安全的版本:publicclassServletextendsHttpServlet{publicintrequestCount=0;@Overridep

java - Java 中的子线程是否会阻止父线程终止?

当我在另一个线程中创建并启动一个线程时,它会是一个子线程吗?它会阻止子线程运行时父线程的终止吗?例如:newThread(newRunnable(){@Overridepublicvoidrun(){//DoSthnewThread(newRunnable(){@Overridepublicvoidrun(){//DoSthnewThread(newRunnable(){@Overridepublicvoidrun(){//DoSth}}).start();//DoSth}}).start();//DoSth}//DoSth}).start(); 最佳答案

java - java中有没有默认的线程池

我可以在java中创建一个新的线程池并使用ExecutorService.newFixedThreadPool在其上执行任务和ExecutorService.submit方法。是否有一个“默认”线程池,我可以为我的Java程序中的所有执行程序服务重用?还是我只需要创建一个包含默认线程池的单例?C#有一个默认的线程池,它在Task.Factory.StartNew时运行任务。方法被调用。 最佳答案 从Java-8开始就有了ForkJoinPool.commonPool()许多涉及并行或异步执行的方法默认使用它。例如,Arrays.pa

java - 什么是事件派发线程?

我知道“线程”是什么意思,如果我将事件分派(dispatch)线程(EDT)理解为“只是一个线程”,它解释了很多,但显然,它并没有解释一切。我不明白这个线程有什么特别之处。例如我不明白为什么我们应该在EDT中启动一个GUI?为什么“主”线程是GUI的床?好吧,如果我们只是不想占用主线程,为什么我们不能只在“另一个线程”中启动GUI为什么它应该是一些称为EDT的“特殊”线程?然后我不明白为什么我们不能像任何其他线程一样启动EDT?为什么我们应该使用一些特殊工具(称为invokeLater)。以及为什么GUI与其他线程不同,它不会立即启动。我们应该等到它准备好接受我们的工作。是因为EDT可

java - 在 Java 中,如何在单线程程序中抛出 ConcurrentModificationException?

这个问题在这里已经有了答案:WhyisaConcurrentModificationExceptionthrownandhowtodebugit(8个答案)关闭3年前。我正在阅读这个“FreuqentJavaconcurrencyproblems”问题,并被谈论java.util.ConcurrentModificationException的答案弄糊涂了.我对答案的理解是,这可能发生在单线程程序中。如何或什么条件导致以下代码抛出异常?Listlist=newArrayList(Arrays.asList("a","b","c"));for(Stringstring:list){lis

java - 为什么线程 10000 次 start() 调用比 10000 次 run() 调用花费更多时间?

我在线程上做一个helloworld,我使用run()调用(这只是一个普通的方法调用)创建了一个简单线程,并使用start创建了一个重复线程()调用产生另一个线程来处理,但是,start()调用所花费的时间比run()调用所花费的时间多,后者不是线程调用,为什么会这样?开始调用时间:00:00:08:300longtime=System.currentTimeMillis();for(inti=0;i运行调用时间:00:00:01:366longtime=System.currentTimeMillis();for(inti=0;i 最佳答案

java - Java 是否隐式通知等待线程?

我写了一个永远不会停止的测试应用程序。它发出t.wait()(t是一个Thread对象),但我从不调用通知。为什么这段代码结束?尽管主线程在t上同步,但生成的线程仍在运行,因此它不会锁定此对象。publicclassThreadWait{publicstaticvoidmain(StringsArgs[])throwsInterruptedException{System.out.println("hello");Threadt=newMyThread();synchronized(t){t.start();Thread.sleep(5000);t.wait();java.lang.S

java - 线程1在java同步方法1中执行,线程2是否可以在java同步方法2中执行?

想知道是否有人可以帮我解决这个问题。(学生)假设我们有两个线程,“Thread1”和“Thread2”。如果Thread1在方法1中执行,那么Thread2是否可以在方法2中执行?voidmethod1(){synchronized(this){}}voidmethod2(){synchronized(this){}}我要么认为是的,Thread2可以进入,因为“this”只是该方法的实例,或者不能,因为“this”是该类的实例并且Thread1持有它。 最佳答案 没有与特定方法关联的监视器-有与对象关联的监视器。因此,如果您尝试在

Java 唤醒 hibernate 线程

我读了一些其他帖子,但没有找到我正在寻找的确切答案,所以我希望有人能给出一些澄清。我有一个程序会运行一段时间。我有一些在后台运行的线程来执行各种任务,为了简单起见,让我们想想3个线程。ThreadA每10秒执行一次任务,其中ThreadB每30秒执行一次,ThreadC每5分钟执行一次。我不使用忙等待,在指定的时间让线程hibernate。我的问题是关于完全关闭。我有一个变量,每个线程也有读取权限,所以他们可以看到用户何时启动程序退出。下次线程处于Activity状态时,它们退出循环并加入,一切都很好。但是你可以看到ThreadC每5分钟才唤醒一次。我的问题是,我能否在sleep时间结