我是否可以获得一个完整的简单场景,即教程,建议如何使用它,特别是使用队列?
假设我有一个完整的任务队列,我需要提交给执行程序服务.我希望他们一次处理一个.我能想到的最简单的方法是:
但是,我试图完全避免阻塞.如果我有10,000个这样的队列,需要一次处理一个任务,我将耗尽堆栈空间,因为它们中的大多数将保持被阻塞的线程.
我想要的是提交一个任务并提供一个在任务完成时调用的回调.我将使用该回叫通知作为发送下一个任务的标志.(functionaljava和jetlang显然使用了这种非阻塞算法,但我无法理解他们的代码)
如何使用JDK的java.util.concurrent,而不是编写自己的执行器服务?
(向我提供这些任务的队列本身可以阻止,但这是一个需要解决的问题)
为什么在类中声明wait()和notify()方法Object而不是Thread类?
如何在不是线程的对象上调用wait()和notify()方法?那真的没有意义,是吗?
当然,它必须有意义,因为这两种方法可用于所有Java对象.有人可以提供解释吗?我无法理解如何使用wait()和之间的线程之间进行通信notify().
我只是很难有时间去了解背后把概念wait()在Object类.为了这个问题,请考虑是否wait()和notifyAll()在Thread课堂上.
class Reader extends Thread {
Calculator c;
public Reader(Calculator calc) {
c = calc;
}
public void run() {
synchronized(c) { //line 9
try {
System.out.println("Waiting for calculation...");
c.wait();
} catch (InterruptedException e) {}
System.out.println("Total is: " + c.total);
}
}
public static void main(String [] args) {
Calculator calculator = new Calculator();
new Reader(calculator).start();
new Reader(calculator).start();
new Reader(calculator).start();
calculator.start();
}
}
class Calculator extends Thread {
int total; …Run Code Online (Sandbox Code Playgroud) 为什么这个测试程序导致了java.lang.IllegalMonitorStateException?
public class test {
static Integer foo = new Integer(1);
public static void main(String[] args) {
synchronized(foo) {
foo++;
foo.notifyAll();
}
System.err.println("Success");
}
}
Run Code Online (Sandbox Code Playgroud)
结果:
Exception in thread "main" java.lang.IllegalMonitorStateException
at java.lang.Object.notifyAll(Native Method)
at test.main(test.java:6)
Run Code Online (Sandbox Code Playgroud) 我在listVivew的标题中添加了一个视图,
View TopSearch = (View) View.inflate(this, R.layout.search, null);
lv.addHeaderView(TopSearch, null, false);
Run Code Online (Sandbox Code Playgroud)
一切都很好,直到我尝试执行(数据更改时)
adapter.notifyDataSetChanged();
Run Code Online (Sandbox Code Playgroud)
总是崩溃我的应用程序给我以下错误:
> java.lang.ClassCastException:android.widget.HeaderViewListAdapter
如果我删除标题视图,则没有错误.有什么建议?谢谢.
有这个等待声明:
public final native void wait(long timeout) throws InterruptedException;
Run Code Online (Sandbox Code Playgroud)
它可以通过InterruptedException或超时退出,或者因为在另一个线程中调用Notify/NotifyAll方法,Exception很容易捕获但是...
有什么方法可以知道退出原因是超时还是通知?
编辑:
这是一种可行的方法,(虽然我不喜欢)
long tBefore=System.currentTimeMillis();
wait(TIMEOUT);
if ((System.currentTimeMillis() - tBefore) > TIMEOUT)
{
//timeout
}
Run Code Online (Sandbox Code Playgroud) 每个Java Object都有方法wait()和notify()(以及其他变体).我从来没有使用过这些,我怀疑很多其他人都没有.为什么这些如此基本以至于每个对象都必须拥有它们并且在使用它们时是否会有性能损失(可能是某些状态存储在它们中)?
编辑以强调这个问题.如果我有List<Double>100,000个元素,那么每个Double都有这些方法,因为它是扩展的Object.但似乎所有这些都不太可能知道管理它的线程List.
编辑优秀而有用的答案.@Jon有一篇非常好的博文,结合了我的直觉.我也完全赞同@Bob_Cross你应该在担心之前表现出性能问题.(同样作为成功语言的第n定律,如果它是一个性能命中,那么Sun或某人会修复它).
线程可以Object.wait()用来阻塞直到另一个线程调用notify()或notifyAll()在该对象上.
但是如果一个线程想要等到多个对象中的一个被发出信号呢?例如,我的线程必须等待,直到要么 a)使用字节可用从阅读InputStream或b)项被添加到ArrayList.
线程如何等待这些事件发生?
编辑
这个问题涉及等待多个线程完成 - 我的情况涉及一个线程等待许多对象中的一个被单独化.