从我在Java中使用线程的时间开始,我发现了这两种编写线程的方法:
用implements Runnable:
public class MyRunnable implements Runnable {
public void run() {
//Code
}
}
//Started with a "new Thread(new MyRunnable()).start()" call
Run Code Online (Sandbox Code Playgroud)
或者,用extends Thread:
public class MyThread extends Thread {
public MyThread() {
super("MyThread");
}
public void run() {
//Code
}
}
//Started with a "new MyThread().start()" call
Run Code Online (Sandbox Code Playgroud)
这两个代码块有什么显着差异吗?
一个wait()和sleep()在线程之间有什么区别?
我的理解是wait()-ing Thread仍处于运行模式并使用CPU周期但是sleep()-ing不会消耗任何CPU周期吗?
为什么我们都 wait()和sleep():如何实现他们在一个较低的水平有什么不同?
Service,Async Task&Thread之间有什么区别.如果我没有错,他们都习惯在后台做一些事情.那么,如何决定使用哪个以及何时使用?
如果我在同一个类上同步两个方法,它们可以同时在同一个对象上运行吗?例如:
class A {
public synchronized void methodA() {
//method A
}
public synchronized void methodB() {
// method B
}
}
Run Code Online (Sandbox Code Playgroud)
我知道我不能methodA()在两个不同的线程中对同一个对象运行两次.同样的事情methodB().
但是,在运行methodB()时我可以在不同的线程上methodA()运行吗?(同一个对象)
我有2个矩阵,我需要将它们相乘,然后打印每个单元格的结果.一旦一个单元格准备就绪,我需要打印它,但是例如我需要在单元格[2] [0]之前打印[0] [0]单元格,即使[2] [0]的结果已经准备好了.所以我需要按顺序打印它.所以我的想法是让打印机线程等待,直到multiplyThread通知它正确的单元格已准备好打印,然后printerThread将打印单元格并返回等待等等.
所以我有这个线程来进行乘法运算:
public void run()
{
int countNumOfActions = 0; // How many multiplications have we done
int maxActions = randomize(); // Maximum number of actions allowed
for (int i = 0; i < size; i++)
{
result[rowNum][colNum] = result[rowNum][colNum] + row[i] * col[i];
countNumOfActions++;
// Reached the number of allowed actions
if (countNumOfActions >= maxActions)
{
countNumOfActions = 0;
maxActions = randomize();
yield();
}
}
isFinished[rowNum][colNum] = true;
notify();
}
Run Code Online (Sandbox Code Playgroud)
打印每个单元格结果的线程:
public …Run Code Online (Sandbox Code Playgroud) 我在Java 1.6中使用ExecutoreService,简单地开始
ExecutorService pool = Executors.newFixedThreadPool(THREADS).
Run Code Online (Sandbox Code Playgroud)
当我的主线程完成时(以及线程池处理的所有任务),此池将阻止我的程序关闭,直到我显式调用
pool.shutdown();
Run Code Online (Sandbox Code Playgroud)
我可以避免不得不通过某种方式将此池使用的内部线程管理变为deamon线程来调用它吗?或者我在这里遗漏了一些东西.
如果我们在具有两个处理器的机器上有两个正在运行的线程,并且Thread.yield()在其中一个线程中调用,那么是否有理由不做任何事情(调度程序实际上会忽略请求),因为我们有足够的处理器来服务正在运行的线程?
java concurrency multithreading thread-synchronization java-threads
在学习Java 9时,我遇到了一种新的Thread类方法,叫做onSpinWait?.根据javadocs,这个方法用于此:
表示调用者暂时无法进展,直到其他活动发生一个或多个操作为止.
有人能帮助我理解这种方法给出一个真实的例子吗?
作为公认的一部分JDK 10本JEP 312:线程局部握手提出.
我试图理解它的描述,但我仍然不相信我的想法是正确的.
它本质上是尝试恢复类似于弃用的Thread.destroy()的东西吗?
这个界面在理论上怎么样?
java-threads ×10
java ×9
concurrency ×2
android ×1
exception ×1
implements ×1
java-10 ×1
runnable ×1
sleep ×1
spinlock ×1
synchronized ×1
thread-state ×1
threadpool ×1