Tag: multithreading

JavaFX将文本附加到TextArea会抛出exception

答案: JavaFX将文本附加到TextArea会抛出exception 我有一个计算目录大小的线程。 我使用walkFileTree。 要获取一些信息,我将actuall文件附加到textarea。 但是当我有很多文件(例如> 300)时,我得到了 线程“JavaFX Application Thread”中的exceptionjava.lang.ArrayIndexOutOfBoundsException 这是代码: private void startScheduledExecutorService() { Thread dt = new Thread(new Runnable() { public void run() { try { taStatus.appendText(“Dateien werden ermittelt\n”); Files.walkFileTree(quellOrdner.toPath(), new SimpleFileVisitor() { @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) { size += attrs.size(); files++; taStatus.appendText(file.toString() + “\n”); return FileVisitResult.CONTINUE; } }); } […]

notifyAll()抛出IllegalMonitorStateException

我正在设计两个线程:一个必须得到播放器的名称,第二个线程必须等待设置的名称才能继续,但第一个线程中的notify()all抛出了IllegalMonitorStateException错误。 private NameFecth nameFetch; private UseName useName; private Object nameSetLock; public static void method{ nameSetLock = new Object() nameFetch = new NameFetch(nameSetLock); useName = new UseName(nameSetLock); Thread nameFetchThread = new Thread(nameFetch); nameFetchThread.start(); Thread useNameThread = new Thread(useName); useNameThread.start(); } public class NameFetch implements Runnable{ /*variables and constructers*/ public void run(){ /*get name and set the […]

如何从Callable()返回对象

我正试图从call()返回一个二维数组,我遇到了一些问题。 到目前为止我的代码是: //this is the end of main Thread t1 = new Thread(new ArrayMultiplication(Array1, Array2, length)); t1.start(); } public int[][] call(int[][] answer) { int[][] answer = new int[length][length]; answer = multiplyArray(Array1, Array2, length); //off to another function which returns the answer to here return answer; } 这段代码编译,这不是返回我的数组。 我确定我可能使用了错误的语法,但我找不到任何好的例子。 编辑:改变了一下

同步函数和同步块之间有什么区别?

有什么区别 public synchronized void addition() { //something; } 和 public void addtion() { synchronized (//something) { //something; } } 如果我错了,请忽略这个问题。

锁定特定对象的Java线程

我有一个Web应用程序,我正在使用Oracle数据库,我有一个基本上像这样的方法: public static void saveSomethingImportantToDataBase(Object theObjectIwantToSave) { if (!methodThatChecksThatObjectAlreadyExists) { storemyObject() //pseudo code } // Have to do a lot other saving stuff, because it either saves everything or nothing commit() // pseudo code to actually commit all my changes to the database. } 现在没有任何类型的同步,所以n个线程当然可以自由地访问这个方法,当2个线程进入这个方法同时检查时会出现问题,当然还没有任何东西,然后他们都可以提交事务,创建重复的对象。 我不想在我的数据库中使用唯一的密钥标识符来解决这个问题,因为我认为我不应该捕获那个SQLException 。 我也无法在提交之前检查,因为有几个检查不仅1 ,这将花费相当多的时间。 我对锁和线程的体验是有限的,但我的想法基本上是将这个代码锁定在它接收的对象上。 我不知道例如说我收到一个整数对象,并且我用值1锁定我的整数,这只会阻止具有值为1的另一个Integer的线程进入,而所有其他具有value != 1线程都可以自由进入?,这是怎么回事? 此外,如果这是它的工作原理,锁对象如何比较? 它是如何确定它们实际上是同一个对象的? […]

获取Java ProgressMonitor的取消事件

我有一个ProgressMonitor pm和一个SwingWorker sw 。 我想在pm按下cancel按钮pm取消SwingWorker。 我想这不应该太难,我读了一些关于SwingWorker和ProgressMonitor的教程,但是我无法让它工作。 final ProgressMonitor pm = new ProgressMonitor(frame, “checking”, “…”, 0, 100); final SwingWorker sw = new SwingWorker() { protected Object doInBackground() throws Exception { doSomethingAndUpdateProgress(); } }; sw.addPropertyChangeListener(new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent evt) { if(evt.getPropertyName().equals(“progress”)) { updateProgress(); } if(pm.isCanceled()) { cancelAction(); } if(pm.isDone()) { doneAction(); } } }); sw.execute(); […]

一旦我的线程中断,我怎么能中断RestTemplate调用?

我需要创建一个库,在其中我将具有同步和异步function。 executeSynchronous() – 等到我有结果,返回结果。 executeAsynchronous() – 立即返回一个Future,如果需要,可以在其他事情完成后处理。 我的图书馆的核心逻辑 客户将使用我们的库,他们将通过传递DataKey构建器对象来调用它。 然后,我们将使用该DataKey对象构造一个URL,并通过执行它来对该URL进行HTTP客户端调用,然后在我们将响应作为JSON字符串返回之后,我们将通过创建将该JSON字符串发送回我们的客户DataResponse对象。 有些客户会调用executeSynchronous() ,有些可能会调用executeAsynchronous() ,这就是为什么我需要在我的库中单独提供两个方法。 接口: public interface Client { // for synchronous public DataResponse executeSynchronous(DataKey key); // for asynchronous public Future executeAsynchronous(DataKey key); } 然后我有我的DataClient实现上面的Client接口: public class DataClient implements Client { private RestTemplate restTemplate = new RestTemplate(); private ExecutorService executor = Executors.newFixedThreadPool(10); // for synchronous call […]

从Java中的另一个线程更新JTextField

我正在制作一个游戏客户端/服务器,我正在新的线程更新客户端GUI上的一些信息(使用Swing)。 我正在尝试使用SwingUtilities但它不起作用。 另外,我听说SwingUtilities每次使用它时都会创建一个新线程,所以我也在寻找一种新方法(我有10个左右的JTextFields需要更新)。 有没有办法在不使用SwingUtilities的情况下完成? 这就是我现在所拥有的。 SwingUtilities.invokeLater( new Runnable() { public void run() { Client.status.setText(“status = “+status); } });

在捕获“I​​nterruptedException”之后,为什么“Thread.currentThread()。isInterrupted()”的值为false?

作为标题。 public static void main(String[] args) throws InterruptedException { Thread thread = new Thread(new Runnable() { @Override public void run() { try { TimeUnit.SECONDS.sleep(2); } catch (InterruptedException e) { e.printStackTrace(); System.out.println(Thread.currentThread().isInterrupted()); //print false, who reset the interrupt? } } }); thread.start(); TimeUnit.SECONDS.sleep(1); thread.interrupt(); } 在捕获“I​​nterruptedException”之后,为什么“Thread.currentThread()。isInterrupted()”的值为false?

在Thread.sleep()阻塞之前调用并返回Android TextView.setText(),直到sleep()返回。 为什么?

在Android框架中,如果调用了TextView的setText()方法,并且在它返回后调用了Thead.sleep() ,那么在sleep()返回之后,设备的屏幕才会显示给定的文本。 为什么? public class SleeperActivity extends Activity { public void onCreate(Bundle bundle) { super.onCreate(bundle); setContentView(R.layout.main); } public void doDelay(View view) { try { TextView textView = (TextView) view; textView.setText(“Sleeping”); Log.d(“Sleeper”, “This log entry is invoked before sleeping”); Thread.sleep(5000L); textView.setText(“Ready”); } catch (InterruptedException e) { finish(); } } } 未显示的布局有一个按钮,其onClick属性设置为doDelay() 。 编译并运行上面的代码并单击该按钮时,第一次调用setText()传递的文本不会出现在屏幕上,直到线程睡眠五秒钟,即使日志条目出现在在这五秒钟开始之前记录。 为什么会发生这种情况,我应该怎样做才能使第一次调用setText()传递的文本在线程开始进入睡眠状态之前出现在屏幕上?