Tag: multithreading

线程对象在哪里创建? 堆栈还是堆?

当我说出类似的话: Thread t1 = new Thread(); 它是在堆还是堆栈上创建它?

我应该在Java程序中使用多少个线程?

我最近inheritance了一个小型Java程序,它从大型数据库中获取信息,进行一些处理并生成有关信息的详细图像。 原作者使用单个线程编写代码,然后修改它以允许它使用多个线程。 在代码中他定义了一个常量; // number of threads public static final int THREADS = Runtime.getRuntime().availableProcessors(); 然后设置用于创建映像的线程数。 我理解他的理由是线程数不能大于可用处理器的数量,因此将其设置为从处理器中获取全部潜力的数量。 它是否正确? 或者是否有更好的方法来充分利用处理器的潜力? 编辑:为了进一步澄清,正在线程化的特定算法扩展到正在创建的图片的分辨率(每个像素1个线程)。 这显然不是最好的解决方案。 该算法所做的工作是一直需要的,并且是完全数学运算,没有锁或其他因素会导致任何给定的线程hibernate。 我只想最大化程序CPU利用率,以减少完成时间。

Java中的并发:同步静态方法

我想了解如何在Java中对静态方法进行锁定。 假设我有以下课程: class Foo { private static int bar = 0; public static synchronized void inc() { bar++; } public synchronized int get() { return bar; } 我的理解是,当我调用f.get() ,线程获取对象f的锁定,当我执行Foo.inc() ,线程获取类Foo上的锁。 我的问题是两个呼叫如何相互同步? 调用静态方法也会获取所有实例化的锁定,或者相反(这似乎更合理)? 编辑: 我的问题不是static synchronized工作原理,而是静态和非静态方法如何相互同步。 即,我不希望两个线程同时调用f.get()和Foo.inc() ,但这些方法获取不同的锁。 我的问题是这是如何可以预防的,并且在上面的代码中是否被阻止了。

跨不同线程的ThreadLocal值访问

假设ThreadLocal变量为不同的线程保存不同的值,是否可以从另一个线程访问一个ThreadLocal变量的值? 即在下面的示例代码中,是否可以在t1中从t2读取TLocWrapper.tlint的值? public class Example { public static void main (String[] args) { Tex t1 = new Tex(“t1”), t2 = new Tex(“t2”); new Thread(t1).start(); try { Thread.sleep(100); } catch (InterruptedException e) {} new Thread(t2).start(); try { Thread.sleep(1000); } catch (InterruptedException e) {} t1.kill = true; t2.kill = true; } private static class Tex implements Runnable […]

为自定义屏障设计测试类

我必须使用锁作为我课程工作的一部分来实现自定义障碍类。 为了测试我的LockBarrier类,我提出了以下测试代码。 它工作正常,但我担心这是否是正确的方法。 你能否提出我可以做的改进,特别是构建课程。 我认为我的编码方式不正确。 欢迎任何建议。 public class TestDriver { private static LockBarrier barrier; static class Runnable1 implements Runnable { public Runnable1() { } public void run() { try { System.out.println(Thread.currentThread().getId()+” lazy arrived at barrier”); Thread.sleep(10000); barrier.await(); System.out.println(Thread.currentThread().getId()+” passed barrier”); } catch (InterruptedException ie) { System.out.println(ie); } } } static class Runnable2 implements Runnable { […]

Java:嵌套同步块

我在Heinz Kabutz的Java专家通讯版本中看到了这一点,虽然Kabutz博士的文章的其余部分(实际上是全部)都得到了很好的解释和详细说明,但他似乎很清楚这段代码的作用,或者更重要的是,它的意义是: public class SomeObject { private Object lock1; private Object lock2; public void doSomething() { synchronized(lock1) { synchronized(lock2) { // … } } } } 嵌套synchronized块的含义是什么? 这如何影响尝试doSomething()不同线程?

如何在一段时间后重复运行一个线程

我想运行一个线程(在后台执行一些耗时的任务并且不更新UI)它只是从Internet上下载一些文件,它独立于UI。 我想在一段时间间隔后重复运行这个线程。 我怎么能这样做,我有类似下面的线程: boolean mResult =false; void onCreate() { DownloadThread mDownloadThread = new DownloadThread(); mDownloadThread.start(); } class DownloadThread extends Thread implements Runnable { public void run() { // My download code mResult = result; } } 我需要使用Handler来实现这个吗?

测试Java方法是否同步的好方法是什么?

我有几个实现一些接口的类。 接口有一个契约,有些方法应该同步,有些不应该,我想通过unit testing来validation所有实现的合同。 这些方法应该使用synchronized关键字或者锁定this – 非常类似于synchronizedCollection()包装器。 这意味着我应该能够在外部观察它。 要继续Collections.synchronizedCollection()的示例,如果我有一个线程调用iterator(),我仍然可以使用另一个线程进入add()等方法,因为iterator()不应该执行任何锁定。 另一方面,我应该能够在外部同步集合,并看到另一个线程阻塞add()。 有没有一种方法可以测试方法是否在JUnit测试中同步? 我想避免长时间的睡眠陈述。

java Fork / Join池,ExecutorService和CountDownLatch

我们在java中有三种不同的multithreading技术 – Fork / Join池,Executor Service和CountDownLatch Fork / Join pool ( http://www.javacodegeeks.com/2011/02/java-forkjoin-parallel-programming.html ) Fork / Join框架旨在使分而治之的算法易于并行化。 这种类型的算法非常适合于可以分为两个或更多相同类型的子问题的问题。 他们使用递归将问题分解为简单的任务,直到这些变得足够简单直接解决。 然后组合子问题的解决方案以给出原始问题的解决方案 ExecutorService是一个扩展Executor类并表示异步执行的接口。 它为我们提供了管理结束和检测异步任务进度的机制。 invokeAll() :执行给定的任务,返回一个Futures列表,保存状态和结果全部完成。 Future.isDone()对于返回列表的每个元素都为true。 CountDownLatch 🙁 http://examples.javacodegeeks.com/core-java/util/concurrent/countdownlatch-concurrent/java-util-concurrent-countdownlatch-example/ ) CountDownLatch用于同步,以允许一个或多个线程等待,直到在其他线程中执行的一组操作完成。 我的假设: 在这两种替代方案中,只有在完成所有任务/线程后才能知道最终结果。 这三种选择是互补的还是互补的 ?

为什么我需要同步Collections.synchronizedList返回的列表

我发现这是在dos.oracle.com public static List synchronizedList(列表列表) 返回由指定列表支持的同步(线程安全)列表。 为了保证串行访问,必须通过返回的列表完成对后备列表的所有访问。 当迭代它时,用户必须手动同步返回的列表: List list = Collections.synchronizedList(new ArrayList()); … synchronized(list) { Iterator i = list.iterator(); // Must be in synchronized block while (i.hasNext()) foo(i.next()); } 我的问题是:如果Collections.synchronizedList();我为什么必须同步列表来迭代它Collections.synchronizedList(); 应该返回一个已经同步的列表? 我只是在两个线程中访问列表:一个线程只添加,另一个线程获取和删除。 您建议在此方案中使用哪些其他类? 谢谢阅读。