最近在学Java多线程,看到有些文章(http://mgc.name/article.asp?id=827)理解有误,又不能在原页面发表评论,特记录之.
其中讨论了一道SCJP试题
Which two code fragments will execute the method doStuff() in a separate
thread? (choose two)
A. new Thread () {
public void run() { doStuff();
}
};
B. new Thread () {
public void start() { doStuff(); }
};
C.
new Thread() {
public void start() { doStuff(); }
}.run();
D. new
Thread() {
public void run() { doStuff(); }
}.start();
E. new Thread
(new Runnable() {
public void run() { doStuff(); }
}).run();
F. new
Thread (new Runnable() {
public void run() { doStuff(); }
}).start();
题目问那两个选项将创建一个新线程执行doStuff方法.该文章说答案有三个:D、E(其实这个答案是错的)、F
说明如下:
E并不会创建新的线程.E中只有一个线程:主线程main.E中,主线程直接调用run()方法输出”doStuff”(并不是输出”doStuff”就表示创建新的线程).直接调用run()函数,这只是调用一个方法而已,程序中依然只有主线程–这一个线程,其程序执行路径还是只有一条,这样就没有达到写线程的目的.只有start()函数才会真正创建新线程.在调用start()的时候,start()函数会首先进行与多线程相关的初始化(这也是为什么不能直接调用run()函数的原因),然后再调用run()函数.测试代码如下:
public class MyRunnable {
public static void doStuff() {
System.out.println("doStuff");
}
public static void main(String[] args) throws Exception{
new Thread(new Runnable() {
public void run() {
try {
Thread.currentThread().sleep(10);//注1
} catch (InterruptedException e) {
e.printStackTrace();
}
doStuff();
}
}).start();//注2
System.out.println("hello");
}
}
我在测试代码中让新创建的线程等待10ms后执行.如果创建子线程成功,”doStuff”就会在”hello”之后输出.否则程序只有一个线程,即主线程.程序只有一条执行线路:顺序执行,主线程等待10ms,然后依次输出”doStuff”,”hello”(“Stuff”在”hello”之前输出)
—————————————————–
<注>
1:让当前线程等待10ms.如果下面是start(),新创建线程等待10ms.若是run()的话,没有创建新线程,只有一个线程:主线程,主线程等待10ms
2:此处用start(),程序创建新线程,然后新线程等待至少10ms,这10ms里主线程先输出”hello”,然后新创建的子线程运行输出”doStuff”.如果用run(),并没有创建新线程.程序只有一个主线程顺序指向,先调用run()函数,然后主线程等待10ms,然后输出”doStuff”,最后输出”hello”.程序只有一条
线.只能顺序执行,先输出”doStuff”,再”hello”
分享到:
相关推荐
在Java多线程编程中,`Thread` 类的 `run()` 方法和 `start()` 方法扮演着不同的角色,它们之间的区别是理解并发执行的关键。 首先,`start()` 方法是真正启动新线程的方法。当你调用 `Thread` 对象的 `start()` ...
本文将详细介绍Java线程中start和run的区别,通过示例代码帮助大家更好地理解这两个方法的作用和区别。 start方法 start方法是Thread类中的一个方法,用于启动一个新线程。当用start()开始一个线程后,线程就进入...
线程中start方法和run方法的区别
本文将全面解析Java线程中的`start`和`run`方法,以及自定义线程的两种常见方式。 首先,自定义线程有两种主要方法: 1. 实现`Runnable`接口:创建一个类实现`Runnable`接口,并重写`run`方法。然后,将这个实现了...
首先,我们要明确`start`方法和`run`方法在Java线程中的作用: 1. **`start`方法**:当我们调用`Thread`对象的`start`方法时,Java虚拟机(JVM)会创建一个新的线程来执行`run`方法中的代码。这意味着`run`方法的...
`Thread`类是Java中用于创建和管理线程的核心类,而`start()`和`run()`方法是与线程执行密切相关的方法,它们之间存在显著的区别。 首先,`run()`方法是`Runnable`接口或`Thread`类中的一个成员方法。当你需要创建...
总的来说,理解和掌握Java线程的创建、运行、同步以及线程安全,是成为一名合格的Java开发者必不可少的技能。通过学习和实践,开发者可以编写出更加高效、健壮的多线程应用程序,以应对复杂的并发编程挑战。
Java线程是Java编程中非常重要的一个概念,它可以帮助开发者实现多任务并行处理,提高程序的执行效率。理解线程的创建、生命周期管理以及线程间的同步和通信机制对于开发高质量的Java应用至关重要。希望以上内容能够...
Java线程状态流转图是一种用于描述Java线程生命周期中不同的状态和状态转换的图形表示方式。该图形展示了Java线程从创建到终止的整个生命周期,并详细介绍了每种状态的特点和转换规则。 NEW(初始化状态) 在Java...
Java线程是Java编程中的重要概念,特别是在多核处理器和并发处理中不可或缺。Java线程允许程序在同一时间执行多个不同的任务,从而提高了程序的效率和响应性。在燕山大学信息学院计算机系的课程中,李峰教授讲解了...
这种方式的优点是每个线程有自己的实例,可以拥有自己的属性和方法,但缺点是每个线程类只能继承一个类,限制了类的继承性。 2. 实现Runnable接口: 创建一个实现了Runnable接口的类,然后在实现的`run()`方法中...
`start()`方法不会立即执行`run()`方法,而是将它放入线程的执行队列中,等待JVM调度执行。由于线程的并发性,两个线程可能会交错执行,因此输出结果可能会有不同顺序,但最终加法的结果总和应该为5050。 在多线程...
在Java编程语言中,线程是程序执行的基本单元,它允许程序并发地执行多个任务。在多线程环境中,程序的...在编写`test`这样的示例时,你可以创建并启动线程,测试各种线程控制和同步方法,从而加深对Java线程的理解。
Java提供了两种主要的方法来创建线程,分别是直接继承自`Thread`类和实现`Runnable`接口。这两种方法各有其特点和适用场景。 1. **继承Thread类**: 当你选择继承`Thread`类时,你需要创建一个新的类,该类直接...
线程优先级和守护线程也是Java线程中的一部分,`Thread`类提供了设置优先级的方法,高优先级的线程更有可能获得CPU执行时间。守护线程是一种特殊的线程,它不会阻止JVM的退出,除非所有的非守护线程都已结束。 书中...
Java线程是并发编程的核心部分,它允许程序在同一时间执行多个独立的任务,从而提高系统效率和响应速度。本文将深入探讨Java线程的概念、生命周期、实现方式以及相关的同步机制。 首先,理解线程的基本概念至关重要...
Java线程是Java编程语言中的核心概念,尤其在多任务处理和并发编程中扮演着重要角色。线程允许一个程序内部同时执行多个独立的控制流,使得程序能够更高效地利用处理器资源。本文将深入解析Java线程的相关知识点,...
Java多线程机制是Java编程中至关重要的一部分,它允许程序同时执行多个任务,提升应用程序的效率和响应性。以下是对各个知识点的详细说明: 9.1 Java中的线程: Java程序中的线程是在操作系统级别的线程基础上进行...
为了在多线程中同步进度更新,我们可以利用synchronized关键字、wait()、notify()方法,或者使用Java并发库中的高级工具,如Semaphore、CyclicBarrier或CountDownLatch等。 一个简单的进度条实现可以采用共享变量...
Java多线程是Java编程中的重要概念,尤其在如今的多核处理器环境下,理解并熟练掌握多线程技术对于提高程序性能和响应速度至关重要。本资料详细讲解了Java多线程的原理,并提供了丰富的实战代码,非常适合Java初学者...