Tag: multithreading

具有Netty的multithreadingUDP服务器

我正在尝试使用Netty实现UDP服务器。 想法是只绑定一次(因此只创建一个Channel )。 此Channel仅使用一个处理程序进行初始化,该处理程序通过ExecutorService在多个线程之间调度传入数据报的处理。 @Configuration public class SpringConfig { @Autowired private Dispatcher dispatcher; private String host; private int port; @Bean public Bootstrap bootstrap() throws Exception { Bootstrap bootstrap = new Bootstrap() .group(new NioEventLoopGroup(1)) .channel(NioDatagramChannel.class) .option(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT) .handler(dispatcher); ChannelFuture future = bootstrap.bind(host, port).await(); if(!future.isSuccess()) throw new Exception(String.format(“Fail to bind on [host = %s , port = […]

RxAndroid:在Schedulers.io()线程上更改UI

我在IO线程上有简单的工作,它正在改变主屏幕壁纸,之后我试图在UI线程上运行一些动画: AppObservable.bindFragment(this, Observable.just(0)) .observeOn(Schedulers.io()) .subscribe(v -> setWallpaperOnSeparateThread()); private void setWallpaperOnSeparateThread() { WallpaperHelper.setBitmapAsWallpaper(photoViewAttacher.getVisibleRectangleBitmap(), getBaseActivity()); AppObservable.bindFragment(this, Observable.just(0)) .delay(500, TimeUnit.MILLISECONDS) .observeOn(AndroidSchedulers.mainThread()) .subscribe(integer -> loadFinishAnimationAfterSetWallpaper()); } 但是这种方法导致错误: java.lang.IllegalStateException: Observers must subscribe from the main UI thread, but was Thread[RxCachedThreadScheduler-1,5,main] 我试图将第二个Observable改为: AppObservable.bindFragment(this, Observable.just(0)) .delay(2000, TimeUnit.MILLISECONDS) .observeOn(Schedulers.io()) .subscribeOn(AndroidSchedulers.mainThread()) .subscribe(integer -> loadFinishAnimationAfterSetWallpaper()); 但它没有帮助。

线程安全的Enum Singleton

枚举有助于创建单身人士。 我知道枚举方法不是线程安全的,所以我试着让它成为线程安全的。 任何人都可以确认这种实施是否正确。 是否可以使用静态和易失性这么多地方并且可以进行优化? 由于内部类是私有的,因此我必须在枚举中创建函数以访问内部类function。 可以优化吗? import java.util.Date; public enum SingletonWithEnum { INSTANCE; private static class Singleton{ private static volatile int count; private static volatile Date date; public static int getCount() { return count;} public static void setCount(int countParam) { synchronized(Singleton.class){ count = countParam; }} public static Date getDate() { return date;} public static void […]

条件vs对象等待/通知

我正在阅读有关Condition对象以及它们如何为每个对象提供多个等待集,以及区分哪个对象或一组对象/线程获得特定信号。 为什么常规Object不这样做? 例如 代替: final Condition notFull = lock.newCondition(); final Condition notEmpty = lock.newCondition(); lock.lock(); try { while (count == items.length) notFull.await(); items[putptr] = x; if (++putptr == items.length) putptr = 0; ++count; notEmpty.signal(); 我们这样做: final Object notFull = new Object(); final Object notEmpty = new Object(); lock.lock(); try { while (count == items.length) notFull.wait(); […]

Java中的目录扫描程序

连续扫描一组目录以获取一组文件名filter。 对于到达的每个文件名filter,处理文件并重复所有步骤 在jdk 1.5中可能推荐的设计是什么,可能使用java.concurrent.Executor和Future

ScheduledExecutorService与使用Thread.sleep()滚动自己的Runnable之间的区别

使用ScheduledExecutorService的scheduleAtFixedRate()运行一段代码而不是创建一个新的Runnable有一个好处,它有一个永久循环与Thread.sleep() ,导致线程为所需的内容hibernate期? 使用其中一种方法可以获得性能提升吗?

内存不足:使用hashset进行multithreading处理

我已经实现了一个java程序。 这基本上是一个具有固定线程数的multithreading服务。 每个线程一次执行一个任务,创建一个hashSet,hashset的大小可以在单个hashset中从10到20,000个项目变化。 在每个线程结束时,使用synchronized将结果添加到共享集合List。 问题发生在某些时候我开始出现内存exception。 在进行了一些研究之后,我发现当GC忙于清除内存时会发生这种内存exception,此时它会阻止整个世界执行任何操作。 请给我关于如何处理如此大量数据的建议。 Hashset是否是一个正确的数据结构? 如何处理内存exception,我的意思是一种方法是使用System.GC(),这又不好,因为它会减慢整个过程。 或者,在将其添加到共享集合列表后,是否可以处理“HashSet hsN”? 请让我知道你的想法并指导我,无论我哪里出错。 这项服务将处理大量的数据处理。 谢谢 //business object – to save the result of thread execution public class Location{ integer taskIndex; HashSet hsN; } //task to be performed by each thread public class MyTask implements Runnable { MyTask(long task) { this.task = task; } @Override public void […]

Windows 64位上的Tess4j:multithreading上的exception

我在Windows 64位上使用tesseract 3和Java 8到OCR扫描的PDF。 我已按照Tess4j页面上的说明操作并使用了所需DLL的64位版本,并安装了64位Ghostscript。 当我使用正常的@Test(无参数)运行我的unit testing时, 代码运行正常 ,所以我想我已经正确安装了所有内容。 当我用2个并行线程运行它时(见下文)我得到一个例外。 我已经在这里阅读了相关的主题,但是建议使用我正在使用的Tesseract1(我已经尝试过)。 有任何想法吗? 这是代码: // @Test // works @Test(invocationCount = 2, threadPoolSize = 2) public void testOcr() throws OcrException, TesseractException { File scannedPdf = new File(this.getClass().getClassLoader().getResource(“scanned.pdf”).getFile()); // Tesseract instance = Tesseract.getInstance(); // JNA Interface Mapping Tesseract1 instance = new Tesseract1(); // JNA Direct Mapping String str […]

在multithreading程序中缓冲db插入

我有一个系统,它使用大约30个线程作为一个时间将大量的任务分解成小任务。 当每个单独的线程完成时,它将计算结果持久存储到数据库中。 我想要实现的是让每个线程将其结果传递给一个新的persisance类,该类将在其自己的线程中运行时执行一种双缓冲和数据持久性。 例如,在100个线程将其数据移动到缓冲区的持久性类之后,持久性类交换缓冲区并将所有100个条目保留到数据库。 这将允许使用预准备语句,从而减少程序和数据库之间的I / O. 这种multithreading双缓冲有一个模式或好的例子吗?

Java中synchronized关键字的记忆效应

这可能之前已经得到解答,但由于问题的复杂性,我需要确认。 所以我重新解释这个问题 问题1 :当线程进入同步块时,内存屏障将包括触摸的任何字段,而不仅仅是我同步的对象的字段? 因此,如果在同步块内修改了许多对象,那么在线程内存缓存之间会有大量内存移动。 Thread 1 object.field1 = “”; synchronized (lock) { farAwayObject.field1 = “”; farAwayObject.evenFarther.field2 = “”; } Thread 2. assuming thread ordering is correct synchronized (lock) { //thread 2 guaranteed to see all fields above as “” //even object.field1 ? } 问题2 :是object.field1 = “”; 在线程1中隐含地部分发生在之前的关系? 我希望它是,但它可能不会。 如果没有,是否有一个技巧,使它没有把它放入同步块? 否则很难对该程序进行推理,将所有内容置于synchronized {}之下是不切实际的。 编辑:澄清:object.field1不是易失性的,问题是“将线程2保证看到线程1的写入,至少”。 我的问题是内存可见性。 […]