Tag: 并发

从辅助线程在主线程上运行代码?

这是一个普通的Java问题,而不是Android首先关闭的问题! 我想知道如何在主线程上运行代码,从辅助线程的上下文。 例如: new Thread(new Runnable() { public void run() { //work out pi to 1,000 DP (takes a while!) //print the result on the main thread } }).start(); 那种事情 – 我意识到我的例子有点差,因为在Java中你不需要在主线程中打印出来的东西,而且Swing也有一个事件队列 – 但是你可能需要的通用情况在后台线程的上下文中,在主线程上运行说一个Runnable。 编辑:为了比较 – 这是我在Objective-C中如何做到这一点: dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0UL), ^{ //do background thread stuff dispatch_async(dispatch_get_main_queue(), ^{ //update UI }); }); 提前致谢!

在Windows上用Java编写并发文件

当您在同一个文件上同时打开两个(或更多)FileOutputStream时会发生什么? Java API说: 特别是某些平台允许一次只打开一个FileOutputStream(或其他文件写入对象)来写文件。 我猜Windows不是这样一个平台,因为我有两个线程读取一些大文件(每个都是一个不同的文件),然后将其写入相同的输出文件。 抛出没有exception,文件被创建并且似乎包含来自两个输入文件的块。 附带问题: 对于Unix也是如此吗? 而且因为我希望行为是相同的(实际上我希望一个线程正确编写而另一个线程被警告冲突),我怎样才能确定文件已经打开进行写入?

Java:jsr166y Phaser的教程/解释

这个问题是两年前提出的,但它提到的资源要么不是很有用(恕我直言),要么链接不再有效。 必须有一些很好的教程才能理解Phaser 。 我已经阅读了javadoc,但是我的眼睛茫然,因为为了真正理解javadoc你必须知道如何使用这些类。 有人有什么建议吗?

从Java线程返回值

我有一个类似以下的Java线程: public class MyThread extends Thread { MyService service; String id; public MyThread(String id) { this.id = node; } public void run() { User user = service.getUser(id) } } 我有大约300个ID,每隔几秒钟 – 我启动线程来调用每个id。 例如。 for(String id: ids) { MyThread thread = new MyThread(id); thread.start(); } 现在,我想从每个线程收集结果,并对数据库进行批量插入,而不是每2秒进行300次数据库插入。 知道我怎么能做到这一点?

预初始化工作线程池以重用连接对象(套接字)

我需要在Java中构建一个工作池,每个工作者都有自己的连接套接字; 当工作线程运行时,它使用套接字但保持打开状态以便以后重用。 我们决定使用这种方法,因为与临时创建,连接和销毁套接字相关的开销需要太多的开销,因此我们需要一种方法,通过这种方法,工作池预先初始化其套接字连接,准备好承担工作同时保持套接字资源免受其他线程的影响(套接字不是线程安全的),所以我们需要沿着这些方向做点什么…… public class SocketTask implements Runnable { Socket socket; public SocketTask(){ //create + connect socket here } public void run(){ //use socket here } } 在应用程序启动时,我们想要初始化工作程序,并希望套接字连接也能以某种方式… MyWorkerPool pool = new MyWorkerPool(); for( int i = 0; i < 100; i++) pool.addWorker( new WorkerThread()); 当应用程序请求工作时,我们将任务发送到工作池以立即执行… pool.queueWork( new SocketTask(..)); 更新了工作代码 基于Gray和jontejj的有用评论,我得到以下代码… SocketTask public class SocketTask […]

每个处理器的线程数

在Java中,是否有一种编程方式可以找出CPU支持多少并发线程? 更新 为了澄清,我不是想用线程来锤击CPU,而是我知道Runtime.getRuntime()。availableProcessors()函数,它提供了我正在寻找的部分信息。 我想知道是否有办法自动调整线程池的大小,以便: 如果我在1岁的服务器上运行,我得到2个线程(每个CPU 1个线程x 2个任意乘数) 如果我在两年后切换到Intel i7四核(每个核心支持2个线程),我会得到16个线程(每个CPU 2个逻辑线程x 4个CPU x 2个任意乘数)。 相反,如果我使用八核Ultrasparc T2服务器(每个核心支持8个线程),我得到128个线程(每个CPU 8个线程x 8个CPU x任意乘数2) 如果我在可能在不同年份购买的30台不同机器的集群上部署相同的软件,我不需要读取CPU规格并为每一台机器设置配置选项。

什么案例需要Java中的同步方法访问?

在什么情况下需要同步访问实例成员? 我理解,对类的静态成员的访问总是需要同步 – 因为它们在类的所有对象实例中共享。 我的问题是,如果我不同步实例成员,我什么时候会不正确? 例如,如果我的class级是 public class MyClass { private int instanceVar = 0; public setInstanceVar() { instanceVar++; } public getInstanceVar() { return instanceVar; } } 在什么情况下(使用类MyClass )我需要有方法: public synchronized setInstanceVar()和public synchronized getInstanceVar() ? 提前感谢您的回答。

我应该将我的ThreadLocals放入弹簧注入的单例中吗?

有几个人(例如在服务器端http://www.theserverside.com/news/thread.tss?thread_id=41473 )建议使用ThreadLocal对象与使用全局变量一样糟糕。 我想如果你把它们变成公共静态变量就行了。 那么问题是很难分辨它的使用位置,改变的位置等等。 在我的春季DI tomcat web-app中,它似乎可以解决这个问题,如果我只是让Spring创建一个包含ThreadLocal的单例对象,然后将该单例注入任何需要它的类中。 所以我的单身人士看起来像这样: @Component public class Username { private ThreadLocal username; public Username() { username = new ThreadLocal(); } public String getUsername() return username.get(); } public void setUsername(String name) { username.set(name); } } 可能需要它的类看起来像这样: @Service public class addEntryTransaction { @Autowired Username username; public void method() { … log(“Method called by […]

Java中的并发和阻塞队列

我有一个线程将事件推送到第二个线程的传入队列的经典问题。 只有这一次,我对表现很感兴趣。 我想要实现的是: 我希望并发访问队列,生产者推送,接收器弹出。 当队列为空时,我希望使用者阻塞队列,等待生产者。 我的第一个想法是使用LinkedBlockingQueue ,但我很快意识到它不是并发的,性能受到了影响。 另一方面,我现在使用ConcurrentLinkedQueue ,但我仍然在每个发布上支付wait() / notify()的成本。 由于消费者在找到空队列时没有阻塞,因此我必须在锁上进行同步和wait() 。 另一方面,生产者必须获得该锁定并在每个出版物上notify() 。 总体结果是我在每个出版物中支付sycnhronized (lock) {lock.notify()}的成本,即使不需要也是如此。 我想这里需要的是一个阻塞和并发的队列。 我想象一个push()操作在ConcurrentLinkedQueue工作,当push元素是列表中的第一个元素时,对象提供额外的notify() 。 我认为这样的检查已经存在于ConcurrentLinkedQueue ,因为推送需要连接下一个元素。 因此,这比每次在外部锁上同步要快得多。 是这样的/合理的吗?

Java框架在while循环期间无法正确显示

这是一个严重的问题我有一个jFrame。 我有一个“主框架”,一切都完成了,但是我有另一个框架,其中有一个gif图像(加载,这个圆形的圆圈),用作一个闪屏,说“正在处理,请稍候”但是当我拉过那个框架并且我的while循环运行时,框架变成空白,直到循环之后才会显示任何内容。 我假设这是由于while循环消耗计算机资源并“阻止”任何其他进程运行。 请告知我应该做什么。 声明新帧的代码是标准的,但我会在下面发布它。 Processing nc = new Processing(); nc.setVisible(true); 这是我的完整代码,所以你可以看到我想要实现的目标: 第1帧的代码(Excel Extractor): Processing nc = new Processing(); nc.setVisible(true); JFileChooser chooser = new JFileChooser(); chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); int option = chooser.showOpenDialog(this); // parentComponent must a component like JFrame, JDialog… if (option == JFileChooser.APPROVE_OPTION) { File selectedFile = chooser.getSelectedFile(); directory = selectedFile.getAbsolutePath(); System.out.println(directory); } //create a input […]