在Java中设计并发线程时使用Runnable和Callable接口有什么区别,为什么要选择一个而不是另一个呢?
我一直试图找到一个好的定义,并了解一个线程到底是什么.
似乎我必须遗漏一些明显的东西,但每当我读到一个线程是什么时,它几乎是一个循环定义,一个"线程是一个执行线程"或"一种分为运行任务的方法".呃呃.咦?
从我所读到的看来,线程并不是真正具体的东西,就像进程一样.它实际上只是一个概念.从我所理解的这种工作方式,处理器为程序(这已被称为一个执行一些命令执行的线程),那么当它需要切换到处理一些其他节目了一下,它存储状态的它正在某个地方执行的程序(线程本地存储),然后开始执行其他程序的指令.而来回.这样,一个线程实际上只是当前正在运行的程序的"执行路径之一"的概念.
与流程不同,流程确实是某种东西 - 它是资源的集合等.
作为一个定义的例子并没有真正帮助我...
来自维基百科:
"计算机科学中的一个线程是执行线程的缩写.线程是程序将(称为"拆分")本身划分为两个或多个同时(或伪同时)运行任务的一种方式.线程和进程不同于一个操作系统到另一个,但通常,一个线程包含在进程内,同一进程中的不同线程共享相同的资源,而同一多任务操作系统中的不同进程则不共享.
我是对的吗?错误?真的是什么线程?
编辑:显然,一个线程也给出了自己的调用堆栈,所以这是有点的具体事情.
我有以下代码片段:
public class A {
public static void main(String[] arg) {
new Thread() {
public void run() {
System.out.println("blah");
}
};
}
}
Run Code Online (Sandbox Code Playgroud)
在这里,如何start()在不创建线程类实例的情况下为线程调用方法?
我正在寻找实现以下内容的最简单,最直接的方法:
n同时运行任务.n到达,没有更多的工人开始,直到运行的线程数降回到低于n.当线程启动时,JVM会在该线程上调用Java Thread的run()方法.要给线程做一些事情,你可以创建一个Thread的子类并覆盖它的run()方法,或者(首选)你可以为线程的构造函数提供一个Runnable.没关系.
我正在制作一个Thread的子类并重写run,我意识到我无法使该方法受到保护,因为Thread.run()是公共的.然后我意识到了原因:它必须是公共的,因为Thread实现了Runnable.但为什么它实现了Runnable?
这似乎不符合逻辑.一个线程是可启动的(来自当前线程),但是你没有像运行()一个Runnable(来自当前线程)那样运行它; 线程自己运行(在自己的线程上).如果你手动调用Thread的run方法,那么你不是将它用作Thread,只是一个重量级的Runnable.
由于这种设计,任何可以访问Thread对象的代码都可以调用它的公共运行方法,并可能潜入代码,这些代码不是公开的,或者设计为以这种方式调用.它还允许这样的非常奇怪的事情:
Thread.currentThread.run();
Run Code Online (Sandbox Code Playgroud)
Thread实现Runnable是否有合法用途,我没有看到?
(危险的问题,我希望当我遇到这个问题时答案已经在线)
使用Java 1.4,我有一个方法,我想在某些时候作为一个线程运行,但不是在其他人.所以我将它声明为Thread的子类,然后根据我的需要调用start()或run().
但我发现我的程序会随着时间的推移泄漏内存.我究竟做错了什么?
我在从应用程序上下文中提取Spring bean时遇到问题.
当我尝试;
InnerThread instance = (InnerThread) SpringContextFactory.getApplicationContext().getBean("innerThread", InnerThread.class);
Run Code Online (Sandbox Code Playgroud)
我明白了
org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'innerThread' must be of type [com.generic.InnerThread], but was actually of type [$Proxy26]
Run Code Online (Sandbox Code Playgroud)
如果没有getBean()调用中的指定类,我会得到一个ClassCastException(您可以在下面详细介绍).
InnerThread bean被初始化为非单例,因为我需要多个实例.InnerThread类还扩展了Thread.有趣的是,这个错误出现在OuterThread中,它的设置方式与InnerThread完全相同.
我试图在下面包含所有相关的代码清单/堆栈跟踪.拥有更多Spring经验的人能告诉我这里发生了什么吗?
OuterThread.java片段:
public class OuterThread extends Thread {
private Queue<InnerThread> createInnerThreads() {
Queue<InnerThread> threads = new ArrayBlockingQueue();
ApplicationContext ctx = SpringContextFactory.getApplicationContext();
int i = 0;
for (SearchRule search : searches) {
logger.debug("Number of times looped " + i++);
//Seprated lines to get a better sense of what is going on
Object …Run Code Online (Sandbox Code Playgroud) Java Thread本身实现了Java Runnable!并且根据Internet上的大多数专家,实现Runnable比扩展Thread更受欢迎!即使我们不能在Thread类的线程意义上使用Runnable!
那么为什么我们更喜欢实现Runnable过度扩展,Thread因为在这两种情况下,通过调用一个Thread实现的方法(即start()或者run())来说明实际的线程,尽管在Thread我们没有真正"扩展" Thread仅通过覆盖run()方法的功能的情况下?
如果我听起来很混乱,我道歉......
java ×8
runnable ×3
interface ×2
aop ×1
callable ×1
casting ×1
concurrency ×1
definition ×1
memory-leaks ×1
oop ×1
process ×1
spring ×1