- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试学习 Java 中的线程。我已经遵循了两个不同的教程,但我觉得我并没有真正理解这个概念。据我了解,当您创建线程时,您使用 Thread 类,然后在线程中嵌入您自己的对象。我可以做到这一点,但我不知道如何访问“嵌入”对象中的实例变量。
假设作为一项学习练习,我想创建三个线程,这三个线程将相互独立地工作。我可以定义这个对象来“驱动”线程:
public class StoogeObject implements Runnable {
String name;
int data;
public StoogeObject(String name, int data){
this.name=name;
this.data=data;
}
@Override
public void run() {
System.out.println("Thread "+this.name+" has this data: "+this.data);
// Do useful work here
System.out.println("Thread "+this.name+" is exiting...");
}
public String getName(){
return this.name;
}
}
然后,在驱动程序中,我将启动我的线程:
public class driver {
public static void main(String[] args){
Thread stooge1 = new Thread(new StoogeObject("Larry", 123));
Thread stooge2 = new Thread(new StoogeObject("Curly", 456));
Thread stooge3 = new Thread(new StoogeObject("Moe", 789));
stooge1.start();
stooge2.start();
stooge3.start();
if(stooge1.isAlive())
System.out.println("From main(): "+stooge1.getName());
}
}
输出是:
From main(): Thread-0
Thread Larry has this data: 123
Thread Curly has this data: 456
Thread Moe has this data: 789
Thread Larry is exiting...
Thread Curly is exiting...
Thread Moe is exiting...
当 main() 中的 stooge1.getName() 行生成“Thread-0”而不是“Larry”时,我感到很惊讶。我期望我在 stoogeObject.java 中编写的 getName() 方法覆盖并返回此实例中的实例变量 String name 。相反,我获取的是 Thread 的名称,而不是 StoogeObject。
所以... stooge1
线程中有一个 StoogeObject
,但我不知道如何访问它的实例变量。更重要的是,这个例子让我想知道我是否错过了线程的要点。如果我希望我的 Larry、Curly 和 Moe 对象能够完成高效的工作并保留它们自己的实例变量,那么使用线程是错误的方法吗?我应该重新开始,将这些对象变成进程吗?
最佳答案
I can't figure out how to access the instance variables within the "embedded" object.
访问它们的方式与访问任何其他对象的实例变量完全相同。
“嵌入”对象(仅供引用)称为线程的目标或线程的委托(delegate)。
Thread
的目标没有什么特别的。它只是一个对象。
I was surprised when the stooge1.getName() line in main() produced "Thread-0", not "Larry". I was expecting ... Instead, I'm getting the name of the Thread, not the StoogeObject.
这是因为 Thread
对象和 StoogeObject
是不同的对象。
this example makes me wonder if I'm missing the point of threads.
在程序中可以通过两种不同的方式使用线程。第一个(人们经常想到的)是线程是 Java 程序如何利用多个 CPU(如果您的平台有多个 CPU)的方式。 (现在几乎所有现代服务器和工作站都有不止一个,而且很多手机和平板电脑也有不止一个。)如果您的平台有,比如说 8 个 CPU,那么最多有 8 个线程如果其中许多“准备好运行”,则可以同时运行。
在程序中使用线程的第二种方法是等待。例如,如果您的程序是一个服务器,它必须等待来自 N 个客户端中每一个客户端的输入,并对其做出响应;您可以将其构造为 N 个线程,每个线程仅监听并响应一个客户端。这通常会使代码更容易理解。 (就像,玩弄一个球比玩弄 N 个球更容易)。
is using threads the wrong way to go here? Should I start over, making these objects into processes?
线程可以比进程更紧密地耦合,因为单个程序的线程都共享相同的虚拟地址空间(即,在 Java 程序中,它们都共享相同的堆)。线程之间的通信通常比同一台机器上不同进程之间的通信快一两个数量级。
如果您需要它们之间进行细粒度的通信,那么它们绝对应该是线程。一个好的经验法则是,应用程序永远不应该生成新进程,除非有充分的理由说明它不应该只是另一个线程。
关于Java:我是否忽略了线程的要点? (线程内的对象),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39214337/
我是一名优秀的程序员,十分优秀!