常用的实现多线程的两种方式

来源:互联网 发布:外卖电话软件 编辑:程序博客网 时间:2024/05/22 17:17

本章,我们学习“常用的实现多线程的2种方式”:Thread 和 Runnable。
之所以说是常用的,是因为通过还可以通过java.util.concurrent包中的线程池来实现多线程。

线程的创建和运行

与每个Java语言中的元素一样,线程是对象。在Java中,我们有2个方式创建线程:
- 通过直接继承thread类,然后覆盖run()方法。
- 构建一个实现Runnable接口的类, 然后创建一个thread类对象并传递Runnable对象作为构造参数

我们将使用第二种方法来制作一个简单的程序,它能创建和运行10个线程。每一个线程能计算和输出1-10以内的乘法表。

Runnable的多线程示例

创建一个名为Calculator的类,这个类要实现Runnable接口。

package com.lf.creat;/** * Created by LF on 2017/5/10. */public class Calculator implements Runnable {    private int number;    public Calculator(int number) {        this.number = number;    }    @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);        }    }}

创建一个名为 Main的类并包含 main() 方法.

package com.lf.creat;/** * Created by LF on 2017/5/10. */public class Test {    public static void main(String[] args) {        for (int i = 1; i <= 10; i++) {            Calculator calculator = new Calculator(i);            Thread thread = new Thread(calculator);            thread.start();        }    }}

Thread的多线程示例

// ThreadTest.java 源码class MyThread extends Thread{      private int ticket=10;      public void run(){        for(int i=0;i<20;i++){             if(this.ticket>0){                System.out.println(this.getName()+" 卖票:ticket"+this.ticket--);            }        }    } };public class ThreadTest {      public static void main(String[] args) {          // 启动3个线程t1,t2,t3;每个线程各卖10张票!        MyThread t1=new MyThread();        MyThread t2=new MyThread();        MyThread t3=new MyThread();        t1.start();        t2.start();        t3.start();    }  }

每个Java程序最少有一个执行线程。当你运行程序的时候, JVM运行负责调用main()方法的执行线程。

当调用Thread对象的start()方法时, 我们创建了另一个执行线程。在这些start()方法调出后,我们的程序就有了多个执行线程。

当全部的线程执行结束时(更具体点,所有非守护线程结束时),Java程序就结束了。如果初始线程(执行main()方法的主线程)运行结束,其他的线程还是会继续执行直到执行完成。但是如果某个线程调用System.exit()指示终结程序,那么全部的线程都会结束执行。

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

Thread和Runnable的异同点

Thread 和 Runnable 的相同点:都是“多线程的实现方式”。
Thread 和 Runnable 的不同点:
- Thread 是类,而Runnable是接口;
- Thread本身是实现了Runnable接口的类。我们知道“一个类只能有一个父类,但是却能实现多个接口”,因此Runnable具有更好的扩展性。
此外,Runnable还可以用于“资源的共享”。即,多个线程都是基于某一个Runnable对象建立的,它们会共享Runnable对象上的资源。
通常,建议通过“Runnable”实现多线程!

start() 和 run()的区别说明

start() : 它的作用是启动一个新线程,新线程会执行相应的run()方法。start()不能被重复调用。
run() : run()就和普通的成员方法一样,可以被重复调用。单独调用run()的话,会在当前线程中执行run(),而并不会启动新线程!

阅读全文
0 0
原创粉丝点击