《Java程序员面试秘笈》—— 1.2 线程的创建和运行

本节书摘来异步社区《Java 7并发编程实战手册》一书中的第1章,第1.2节,作者:【西】Javier Fernández González,更多章节内容可以访问云栖社区“异步社区”公众号查看。

1.2 线程的创建和运行

在本章中,我们将学习如何在Java程序中创建和运行线程。在Java语言中,线程跟其他所有元素一样,都是对象(Object)。Java提供了两种方式来创建线程:

◆ 继承Thread类,并且覆盖run()方法。

◆ 创建一个实现Runnable接口的类。使用带参数的Thread构造器来创建Thread对象。这个参数就是实现Runnable接口的类的一个对象。

在本章中,我们将使用第二种方法创建一个简单的程序,这个程序将创建并运行10个线程。每个线程用以计算和打印乘以1~10后的结果,即计算和打印乘法表。

准备工作
本节的范例是在Eclipse IDE里完成的。无论你使用Eclipse还是其他的IDE(比如NetBeans),都可以打开这个IDE并且创建一个新的Java工程。

范例实现
按照接下来的步骤实现本节的范例。

1.创建一个名为Calculator的类,它实现了Runnable接口。
``
public class Calculator implements Runnable {``
2.声明一个名为number的私有(private)int属性。编写这个类的一个构造器,用来为属性number设置值。

private int number;
public Calculator(int number) {
  this.number=number;
}```
3.编写run()方法。这个方法用来执行我们创建的线程的指令,本范例中它将对指定的数字进行乘法表运算。

@Override
public void run() {
for (int i=1; i<=10; i++){

System.out.printf("%s: %d * %d = %d\n",Thread. currentThread().getName(),number,i,i*number);

}
}`
4.现在编写范例的主类。创建一个名为Main的类,创建的时候同时生成main()方法。

public class Main {
  public static void main(String[] args) {```
5.在main()方法中,创建一个执行10次的循环。在每次循环中创建一个Calculator对象,一个Thread对象,这个Thread对象使用刚创建的Calculator对象作为构造器的参数,然后调用刚创建的Thread对象的start()方法。

for (int i=1; i<=10; i++){
Calculator calculator=new Calculator(i);
Thread thread=new Thread(calculator);
thread.start();
}`
6.运行程序,观察不同的线程是如何并行工作的。

工作原理
下面的截图显示了程序的部分运行结果。可以看到我们创建的10个线程的运行情况,它们并行的执行既定任务,并将结果显示出来。

c92b18536db63d97553d2551139d0b6031e345b6

每个Java程序都至少有一个执行线程。当运行程序的时候,JVM将启动这个执行线程来调用程序的main()方法。

当调用Thread对象的start()方法时,另一个执行线程将被创建。因而在我们的程序中,每次调用start()方法时,都会创建一个执行线程。

当一个程序的所有线程都运行完成时,更明确的说,当所有非守护(non-daemon)线程都运行完成的时候,这个Java程序将宣告结束。如果初始线程(执行main()方法的线程)结束了,其余的线程仍将继续执行直到它们运行结束。如果某一个线程调用了System.exit()指令来结束程序的执行,所有的线程都将结束。

对一个实现了Runnable 接口的类来说,创建Thread对象并不会创建一个新的执行线程;同样的,调用它的run()方法,也不会创建一个新的执行线程。只有调用它的start()方法时,才会创建一个新的执行线程。

更多信息
在本章简介中提到过还有另一种方法能够创建新的执行线程。编写一个类并继承Thread类,在这个类里覆盖run()方法,然后创建这个类的对象,并且调用start()方法,也会创建一个执行线程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值