我有以下代码片段: public class A { public static void main(String[] arg) { new Thread() { public void run() { System.out.println("blah"); } }; } } 在这里,如何在不创build线程类的实例的情况下为线程调用start()方法?
我试图以multithreading的方式使用核心数据。 我只是想在后台下载新的数据的同时显示与以前下载的数据的应用程序。 这应该让用户在更新过程中访问应用程序。 我有一个NSURLConnection使用委托(并显示进度)asynchronous下载文件,然后我使用XMLParserparsing新的数据,并在独立的上下文中创build新的NSManagedObjects与自己的persistentStore和使用一个单独的线程。 问题是,在显示它的同一个上下文中创build新的对象可能会抛出BAD_INSTRUCTIONexception。 所以,我决定为新的数据使用一个单独的上下文,但我不能找出一种方法来完成后,将所有的对象移动到另一个上下文。 保罗又名SlowTree
简介:当从本地创build的线程上的本机代码调用回Java时,我看到Java线程泄漏。 (更新2014年2月11日:我们提出了这个问题作为Oracle的支持请求,现在已经被Oracle 确认在Java 7更新45上。它只影响64位Linux(也可能是Mac)平台:32位Linux不受影响) 。 (2014年4月29日更新:甲骨文已经解决了这个问题,并将在Java 7更新80中发布)。 我有一个由Java层和本地库组成的应用程序。 Java层通过JNI调用本地库:然后这会导致一个新的本地线程开始运行,这将调用回Java。 因为新的本地线程没有连接到JVM,所以在进行callback之前需要先连接,然后再分离。 通常的做法似乎是用AttachCurrentThread / DetachCurrentThread调用来callbackJava的代码。 这个工作正常,但是对于我们的应用程序(这个应用程序非常频繁地调用Java),每次附加和分离的开销都很大。 在几个地方(像这里和这里 )描述的优化build议使用基于线程本地存储的机制来消除这个问题:基本上每次触发本地callback时,testing线程是否已经连接到JVM:如果没有,则将其附加到JVM,并使用线程本地存储机制在线程退出时自动分离该线程。 我已经实现了这一点,但是虽然附件和分离似乎正确地发生,这导致在Java端的线程泄漏。 我相信我正在做的一切正在努力,看看可能是错的。 有一段时间我一直在抨击我的头脑,我会非常感激任何见解。 我用缩减的forms重新创build了这个问题。 以下是本地图层的代码。 我们这里有一个封装器,它封装了返回当前线程的JNIEnv指针的过程,使用POSIX线程本地存储机制自动分离线程,如果它尚未连接。 有一个callback类用作Javacallback方法的代理。 (为了消除创build和删除与Java对象相关的全局对象引用的额外复杂性,我已经使用了对静态Java方法的callback,这与这个问题无关)。 最后有一个JNI方法,当被调用时,构造一个callback,并创build一个新的本地线程,并等待它完成。 这个新创build的线程调用一次callback然后退出。 #include <jni.h> #include <iostream> #include <pthread.h> using namespace std; /// Class to automatically handle getting thread-specific JNIEnv instance, /// and detaching it when no longer required class JEnvWrapper { […]
在我回顾的代码库中,我find了下面的习语。 void notify(struct actor_t act) { write(act.pipe, "M", 1); } // thread A sending data to thread B void send(byte *data) { global.data = data; notify(threadB); } // in thread B event loop read(this.sock, &cmd, 1); switch (cmd) { case 'M': use_data(global.data);break; … } “拿着它”,我对作者说,我的团队的一个高级成员,“这里没有内存障碍!你不能保证global.data将从caching刷新到主内存。如果线程A和线程B将运行在两个不同的处理器上 – 这种scheme可能会失败“。 高级程序员咧嘴一笑,缓缓地解释道,仿佛在解释他的五岁男孩怎样系鞋带:“听小男孩,我们在这里看到很多与线程相关的bug,在高负载testing和真实客户端”,他他暂停了一下他那长长的胡须,“但是我们从来没有这个成语的错误”。 “但是,它在书中说…” “挺!”,他立刻给我安静了一下, “从理论上讲,并不能保证,在实践中,你使用函数调用的实际上是一个内存屏障,编译器不会重新排列指令global.data = data ,因为它不知道是否有人在函数中使用它调用,而x86架构将确保其他CPU将在线程B从pipe道读取命令的时候看到这段全局数据。请放心,我们有充足的现实世界问题需要担心,我们不需要在假的理论问题上投入额外的努力。 放心吧,我的孩子,你会明白的,将真正的问题从我需要的博士学位分开来解决。“ […]
我正在阅读关于Java中的volatile关键字,并完全理解它的理论部分。 但是,我正在寻找的是一个很好的例子,它显示了如果variables不是不稳定的,那么会发生什么。 下面的代码片段不能按预期工作( 来自aioobe ) class Test extends Thread { boolean keepRunning = true; public void run() { while (keepRunning) { } System.out.println("Thread terminated."); } public static void main(String[] args) throws InterruptedException { Test t = new Test(); t.start(); Thread.sleep(1000); t.keepRunning = false; System.out.println("keepRunning set to false."); } } 理想情况下,如果keepRunning不是易失性的,线程应该继续不断地运行。 但是,它几秒钟后停止。 我有两个基本的问题: 任何人都可以用例子解释volatile吗? 不符合JLS的理论。 挥发替代品是否同步? […]
我一直在做这方面的研究,但我仍然非常困惑,至less可以说。 任何人都可以给我一个具体的例子,何时使用Task ,何时使用Platform.runLater(Runnable); ? 究竟是什么区别? 什么时候使用这些方法是否有一条金科玉律? 还纠正我,如果我错了,但不是这两个“对象”的方式创build另一个线程内的GUI(用于更新graphics用户界面)的主线程?
我正在开发一个应用程序(winforms C#.NET 4.0),我通过一个简单的HTTP请求从第三方访问查找function。 我用一个参数调用一个url,并返回一个小string,查找的结果。 很简单。 然而挑战是我必须做很多这样的查找(几万),而且我想限制所需的时间。 所以我想平行运行请求(比如10-20)。 我使用一个ThreadPool来做到这一点,我的代码的短版本看起来像这样: public void startAsyncLookup(Action<LookupResult> returnLookupResult) { this.returnLookupResult = returnLookupResult; foreach (string number in numbersToLookup) { ThreadPool.QueueUserWorkItem(lookupNumber, number); } } public void lookupNumber(Object threadContext) { string numberToLookup = (string)threadContext; string url = @"http://some.url.com/?number=" + numberToLookup; WebClient webClient = new WebClient(); Stream responseData = webClient.OpenRead(url); LookupResult lookupResult = parseLookupResult(responseData); returnLookupResult(lookupResult); […]
我怎样才能看到一个Java进程中的线程数量?
我想要一些代码不断在后台运行。 我不想在服务中做到这一点。 有没有其他的方法可行? 我已经尝试在我的Activity调用Thread类,但是我的Activity在某个时间保持在后台,然后停止。 Thread类也停止工作。 class testThread implements Runnable { @Override public void run() { File file = new File(Environment.getExternalStorageDirectory(),"/BPCLTracker/gpsdata.txt"); int i=0; RandomAccessFile in = null; try { in = new RandomAccessFile(file, "rw"); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); […]
在Java中, ConcurrentHashMap有更好的multithreading解决scheme。 那么我应该什么时候使用ConcurrentSkipListMap ? 这是冗余吗? 这两者之间的multithreading方面是否共同?