草庐IT

Tread多线程

全部标签

java - EJB 中的多线程

我正在学习EJB,到目前为止我已经读到EJB中不允许使用多线程,因为容器应该关心线程安全并让开发人员只关注业务逻辑,所以基本上意味着EJB确保只有一个线程可以同时访问Sessionbean中的方法。当我们有许多用户访问EJB中的同一个方法时会发生什么?容器是序列化访问,还是创建不同的bean实例,每个线程一个?谁能解释一下这方面的政策是什么?另外我有点困惑,为什么如果不允许多线程,那么我们不能创建自己的线程,为什么我们有这个@Asynchronous注释? 最佳答案 是的,它创建了多个实例,并将它们集中在一起。查看officialO

java - 在 Java 中创建太多线程

我在我的Java应用程序中使用线程来部分获取数据(使用网络调用)。我有一个方法(不在线程类中),它创建一个给定大小的线程池(最大10-15)并将它们用于网络调用,我多次调用该方法来自一个循环。当我在慢速机器(3GBRAM,Pentium-IV)上运行此应用程序时,一切正常,但当我在iMac(32GBRAM,i7处理器)上运行它时,它创建了太多线程,有时大约2,500次并抛出内存不足错误。我怀疑JVM没有在完成后立即将已完成的线程放回池中,因此它正在创建新线程。即使在iMac上,如果我保持Thread.sleep(1000);在我上面提到的for循环中,一切正常。虽然创建了大约900个线

java - "Cannot reproduce"- Java 确定性多线程是否可能?

这是否可能以确定性方式运行多线程Java应用程序?我的意思是在我的应用程序的两次不同运行中始终进行相同的线程切换。这样做的原因是每次运行都在完全相同的条件下运行模拟。类似的情况是当一个人在使用随机数生成器获得始终相同的“随机”序列时给出一些任意种子。 最佳答案 我不知道有什么实用的方法可以做到这一点。理论上,在某些假设下,可以实现具有完全确定性行为的字节码解释器1。您需要通过完全在软件中实现线程和线程调度并使用单个native线程来模拟多个线程。1-例如,没有I/O,也没有使用系统时钟。

Java 内存模型 happens-before 线程池交互的保证

Java内存模型是否为线程池交互提供happens-before保证?特别是,在运行工作队列中的项目结束之前,线程池工作线程所做的写入对于之后运行队列中下一个项目的工作线程是否可见?规范(我个人认为这个FAQ很有用:http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html#synchronization)声明“线程上对start()的调用发生在启动线程中的任何操作之前。”或者简单地说,您在启动线程之前所做的任何内存写入都将在启动的线程将要执行的run()方法之前执行并对其可见。它与线程池不同,start()通常会在您进行

Java 同步线程未按预期工作

下面的代码没有像我预期的那样工作:importjava.util.ArrayList;importjava.util.List;importjava.util.Random;classWorkerimplementsRunnable{publicvoidrun(){System.out.println("Started.");process();}privateRandomrandom=newRandom();privateObjectlock1=newObject();privateObjectlock2=newObject();privatestaticListlist1=newA

java - 哪个线程通知唤醒?

这个问题在这里已经有了答案:Hownotifymethodworks(1个回答)关闭5年前。假设我有3个线程处于等待状态,第4个线程处于通知状态。现在,所有3个等待线程都运行并进入等待状态。完成后,第4个线程运行并调用一次通知。notify将如何确定唤醒哪个线程?是第一个调用wait的线程,最后调用wait的线程,还是基于其他一些条件?假设等待和通知使用相同的锁。

java - 一个简单的java多线程

好吧,我遇到了一个惊人的问题......publicclassTest{privateboolean[]state=newboolean[]{false,false};publicvoidcreateThread(){Threadth1=newThread(()->{try{System.out.println("1");Thread.sleep(2000);state[0]=true;}catch(InterruptedExceptione){e.printStackTrace();}});Threadth2=newThread(()->{try{System.out.println

java - 为什么无状态 session bean 是单线程的?

根据我的理解,无状态sessionbean用于对业务逻辑进行编码。它们不能将数据存储在它们的实例变量中,因为它们的实例被多个请求共享。所以它们看起来更像是单例类。然而,不同之处在于包含为每个请求创建(或从池中重用)无状态sessionbean的单独实例。谷歌搜索后,我可以找到JavaEE规范说它们应该是单线程的原因。但是我不明白为什么指定为SINGLETHREADED? 最佳答案 由于TX上下文,SLSB是单线程的,Principal在调用时与bean实例相关联。这些beans被合并,除非达到最大池大小,否则将在单独的线程中处理(取

java - 如何取消阻塞在 ServerSocket.accept() 上阻塞的线程?

我有一个带有这段代码的服务器线程:publicvoidrun(){try{ServerSocketserver;EneaLog.printLog("Serverisrunning.");server=newServerSocket(this.portnumber);while(true){newEneaServerConnection(server.accept(),this.project,stopped).start();if(stopped){EneaLog.printLog("Serversafe-shutdowncompleted.");EneaLog.printLog("H

java - 在 Swing 工作线程之外更改模型是否可以?

在“严肃的”JavaGUI应用程序中,许多GUI元素背后都有模型:ADocumentModel支持JEditorPane,例如,或ListModel在JList后面.我们总是被告知不要从Swing工作线程外部更改GUI,并给出SwingUtilities.invoke...()解决这个问题。好吧,我可以忍受!当直接更改GUI组件的属性时,这当然是必要的(并且效果很好)。理想情况下,无论如何,我的大多数GUI可见更改将针对模型,而不是针对JComponents。但是因为它们是GUI可见的,所以它们是否“算”为GUI更改?IE。更改事件和监听器是否提供必要的解耦,或者模型更改是否需要包装在