Tag: multithreading

停止线程并再次开始在blackberry中提供IllegalThreadStateException

使用以下代码时,我收到了IllegalThreadStateExceptionexception:我已经启动了这个线程一次(通过使用thread.start() )并再次尝试在另一个地方启动它,所以使用下面的代码: thread.interrupt(); thread.start(); 但是thread.start()抛出了thread.start() 。 我应该用什么来解决它?

为什么再次调用Thread.start时会发生IllegalThreadStateException

public class SieveGenerator{ static int N = 50; public static void main(String args[]){ int cores = Runtime.getRuntime().availableProcessors(); int f[] = new int[N]; //fill array with 0,1,2…f.length for(int j=0;j<f.length;j++){ f[j]=j; } f[0]=0;f[1]=0;//eliminate these cases int p=2; removeNonPrime []t = new removeNonPrime[cores]; for(int i = 0; i < cores; i++){ t[i] = new removeNonPrime(f,p); } while(p <= […]

Log4j挂起我的应用程序我做错了什么?

首先介绍一下应用程序的背景。 我有一个应用程序通过线程池并行处理许多独立的任务。 线程池现在挂起了。 以下是我的线程转储的片段,pool-2中的所有线程都被“pool-2-thread-78”阻塞。 它似乎被锁定试图写入控制台,我觉得非常奇怪。 任何人都可以为我阐明情况吗? 编辑 :平台详细信息java版“1.6.0_07”Java(TM)SE运行时环境(版本1.6.0_07-b06)Java HotSpot(TM)客户端VM(版本10.0-b23,混合模式,共享) Ubuntu Linux服务器双核四核机。 它似乎在写入printstream时锁定,我考虑过只删除控制台appender然而我宁愿知道它为什么阻塞并根据这些知识删除它。 在过去删除,看看它是否有效已经回来咬我:) 我的log4j中的相关部分 log4j.rootLogger = DEBUG,STDOUT log4j.logger.com.blah = INFO,LOG log4j.appender.STDOUT = org.apache.log4j.ConsoleAppender log4j.appender.LOG = org.apache.log4j.FileAppender 线程转储提取 “pool-2-thread-79”Id = 149 BLOCKED org.apache.log4j.spi.RootLogger@6c3ba437由“pool-2-thread-78”Id = 148所拥有org.apache.log4j.Category.callAppenders( Category.java:201)org.apache.log4j.Category.forcedLog(Category.java:388)atg.apache.log4j.Category.error(Category.java:302)at com.blah.MessageProcessTask.run(MessageProcessTask .java:103)at java.util.concurrent.Executors $ runnableAdapter.call(Executors.java:441)at java.util.concurrent.FutureTask $ Sync.innerRun(FutureTask / java:268)at java.util.concurrent。 FutureTask.run(FutureTask / java:54)java.util.concurrent.ThreadPoolExecutor $ Worker.runTask(ThreadPoolExecutor.java:885)java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:907)at java .lang.Thread.run(Thread.java:619) […]

Java:处理子线程中的exception

我更喜欢在main方法附近的调用堆栈中进一步使用exception处理逻辑。 我喜欢这种方法……但是,我创建了一个线程,其中run()内部的一些方法调用可能会抛出exception。 我真的想看看是否有一种方法可以将这些exception抛回到父线程? 我能想到的最好的方法是在实现Runnable的对象中设置一个变量。 此变量是一个包含错误消息的字符串,然后使用类加载器在父线程中正确地重新创建相同的exception。 我想知道的是,是否有一种不那么混乱的方式来获得我想要的东西? (为了能够确保在子线程中抛出的任何exception都使用相同的exception处理逻辑来处理,就好像它在主线程/代码重用中运行一样)。

在multithreadingJava程序中,每个线程都有自己的System.out副本吗?

我正在编写一个multithreadingJava程序,其中每个线程可能需要将其标准输出重定向到单独的文件。 每个线程都有自己的文件。 是否可以在“每个线程”的基础上重定向System.out,还是在所有线程中更改为System.out全局?

为什么我要在并行流中使用并发特性和collect?

为什么我要在并行流中使用并发特性和collect: List list = Collections.synchronizedList(new ArrayList(Arrays.asList(1, 2, 4))); Map collect = list.stream().parallel() .collect(Collectors.toConcurrentMap(k -> k, v -> v, (c, c2) -> c + c2)); 并不是: Map collect = list.stream().parallel() .collect(Collectors.toMap(k -> k, v -> v, (c, c2) -> c + c2)); 换句话说,不使用此特性会产生什么副作用,它对内部流操作有用吗?

互斥方法

我正在学习Javamultithreading编程。 我有一个以下逻辑: 假设我有一个A类 class A { ConcurrentMap map; public void someMethod1 () { // operation 1 on map // operation 2 on map } public void someMethod2 () { // operation 3 on map // operation 4 on map } } 现在我不需要同步“someMethod1”或“someMethod2”中的操作。 这意味着如果有两个线程同时调用“someMethod1”,我不需要序列化这些操作(因为ConcurrentMap将完成这项工作)。 但是我希望“someMethod1”和“someMethod2”是彼此的互斥,这意味着当某个线程正在执行“someMethod1”时,另一个线程应该等待输入“someMethod2”(但是应该允许另一个线程进入“someMethod1”)。 那么,简而言之,有没有一种方法可以让“someMethod1”和“someMethod2”不是自己的互斥而是互相的互斥? 我希望我说的问题足够明确…… 谢谢!

由静态块中的thread.join()引起的死锁

我遇到了一个死锁场景,可以概括为下面显示的StaticDeadlock类。 这个简单的程序将冻结在o.getClass() 。 这是我对发生的事情的猜测,但有人可以更好地解释一下吗? 1)程序进入StaticDeadlock静态块 2) 线程启动 3) 主线程等待线程完成,因此无法完成静态块 4)在线程内部访问StaticDeadlock.o但StaticDeadlock的静态块尚未完成。 因此程序会冻结吗? public class StaticDeadlock { private static final Object o = new Object(); static { MyThread thread = new MyThread(); thread.start(); try { thread.join(); } catch (InterruptedException e) { e.printStackTrace(); } } public static void main (String[] args) { System.out.println(“all is well.”); } static class […]

守护程序线程和低优先级线程之间的区别

最近我被问到一个问题: 我们有setPriority()方法来设置低优先级的线程。 那为什么我们需要一个守护程序线程。 它们之间有什么区别? 将线程标记为守护进程是否会更改其调度?

内存重新排序如何帮助处理器和编译器?

我研究了Java内存模型并看到了重新排序的问题。 一个简单的例子: boolean first = false; boolean second = false; void setValues() { first = true; second = true; } void checkValues() { while(!second); assert first; } 重新排序是非常不可预测和奇怪的。 此外,它破坏了抽象。 我认为处理器架构必须有充分的理由去做一些对程序员来说太不方便的事情。 这些原因是什么? 关于如何处理重新排序有很多信息,但我找不到任何关于它为什么需要的信息。 在任何地方,人们只会说“这是因为一些性能优势”。 例如,在first存储之前存储second的性能优势是什么? 你能推荐一些关于此的文章,论文或书籍,或者自己解释一下吗?