常用的实现多线程的两种方式
来源:互联网 发布:外卖电话软件 编辑:程序博客网 时间: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(),而并不会启动新线程!
- java多线程—常用的两种实现多线程方式
- 常用的实现多线程的两种方式(二)
- 常用的实现多线程的两种方式
- Java多线程系列--“基础篇”02之 常用的实现多线程的两种方式
- Java多线程系列--“基础篇”02之 常用的实现多线程的两种方式(r)
- Java多线程系列--“基础篇”02之 常用的实现多线程的两种方式
- Java多线程系列--“基础篇”02之 常用的实现多线程的两种方式
- Java多线程系列--“基础篇”02之 常用的实现多线程的两种方式
- Java多线程基础--02之 常用的实现多线程的两种方式
- Java多线程——常用的实现多线程的两种方式
- Java多线程系列--“基础篇”02之 常用的实现多线程的两种方式
- Java多线程系列--【基础篇02】- 常用的实现多线程的两种方式
- Java实现多线程的两种方式
- 实现多线程的两种方式
- JavaLearning:多线程的两种实现方式
- Java实现多线程的两种方式
- 多线程的两种实现方式
- Java多线程实现的两种方式
- JavaWeb开发知识总结(JSP,EL,JSTL)
- 当推荐系统遇上深度学习
- 山东大学项目实训——5月14日
- 自定义RatingBar
- 【lua开发】math 函数
- 常用的实现多线程的两种方式
- 在 Windows下安装Sass和Ruby
- 【2017-5-15】
- 5.使用Intent实现Activity之间对象的传输
- 通过AndroidManifest配置来设计游戏的闪屏页
- 实现读取某文件夹下txt、图片,并按钮点击上一个下一个文件中的txt,图片
- leetcode-78. Subsets(非重复元素子集合)
- Maven 学习
- 【Maven学习】maven基本命令