java--创建多线程两种方法的比较
【通过继承Thread】
一个Thread对象只能创建一个线程,即使它调用多次的.start()也会只运行一个的线程。
【看下面的代码 & 输出结果】
package Test;
class CTest extends Thread {
private int tickte = 20;
public void run() {
while (true) {
if (tickte > 0) {
System.out.println(Thread.currentThread().getName() + " 出售票 "
+ tickte--);
} else {
System.exit(0);
}
}
}
}
public class Demo3 {
public static void main(String[] args) {
// new CTest().start();
// new CTest().start();
Thread t1 = new CTest();//创建一个线程
t1.start();
t1.start();
}
}
//
Thread-0 出售票 20
Thread-0 出售票 19
Thread-0 出售票 18
Thread-0 出售票 17
Thread-0 出售票 16
Thread-0 出售票 15
Thread-0 出售票 14
Thread-0 出售票 13
Thread-0 出售票 12
Thread-0 出售票 11
Thread-0 出售票 10
Thread-0 出售票 9
Thread-0 出售票 8
Thread-0 出售票 7
Thread-0 出售票 6
Thread-0 出售票 5
Thread-0 出售票 4
Thread-0 出售票 3
Thread-0 出售票 2
Thread-0 出售票 1
通过调用当前线程对象的名字Thread.currentThread.getName(),根据结果可以看出,只运行了一个线程。
这就说明了一个问题,每创建一个Thread对象,只能创建一个线程。
下面是创建多个Thread对象。
package Test;
class CTest extends Thread {
private int tickte = 20;
public void run() {
while (true) {
if (tickte > 0) {
System.out.println(Thread.currentThread().getName() + " 出售票 "
+ tickte--);
} else {
System.exit(0);
}
}
}
}
public class Demo3 {
public static void main(String[] args) {
new CTest().start();
new CTest().start();
}
}
上面启动了两个线程对象,他们各自执行自己的互不影响。
结果:
Thread-0 出售票 20
Thread-1 出售票 20
Thread-1 出售票 19
Thread-0 出售票 19
Thread-0 出售票 18
Thread-0 出售票 17
Thread-0 出售票 16
Thread-0 出售票 15
Thread-0 出售票 14
Thread-0 出售票 13
Thread-0 出售票 12
Thread-0 出售票 11
Thread-0 出售票 10
Thread-0 出售票 9
Thread-0 出售票 8
Thread-0 出售票 7
Thread-0 出售票 6
Thread-0 出售票 5
Thread-0 出售票 4
Thread-0 出售票 3
Thread-0 出售票 2
Thread-0 出售票 1
Thread-1 出售票 18
Thread-1 出售票 17
Thread-1 出售票 16
Thread-1 出售票 15
Thread-1 出售票 14
Thread-1 出售票 13
Thread-1 出售票 12
Thread-1 出售票 11
Thread-1 出售票 10
Thread-1 出售票 9
Thread-1 出售票 8
Thread-1 出售票 7
Thread-1 出售票 6
Thread-1 出售票 5
Thread-1 出售票 4
Thread-1 出售票 3
Thread-1 出售票 2
Thread-1 出售票 1
可以看出是创建了两个线程。他们各自执行自己的线程,互不影响。
【多个线程操作一个对象】
public class ThreadDemo9_4
{
public static void main(String [] args)
{
TestThread t = new TestThread() ;
// 启动了四个线程,并实现了资源共享的目的
new Thread(t).start();
new Thread(t).start();
new Thread(t).start();
new Thread(t).start();
}
}
class TestThread implements Runnable
{
private int tickets=;
public void run()
{
while(true)
{
if(tickets>)
System.out.println(Thread.currentThread().getName()+"出售票"+tickets--);
}
}
}
上面通过实现Runnable的方式启动四个进程,但是他们共同操纵同一对象,实现了资源的互斥共享。
结果:
Thread-1 出售票 10
Thread-1 出售票 8
Thread-1 出售票 7
Thread-1 出售票 6
Thread-1 出售票 5
Thread-2 出售票 9
Thread-1 出售票 4
Thread-1 出售票 2
Thread-1 出售票 1
Thread-2 出售票 3
可以看出,虽然是两个线程,但是操作的却只有一个资源。但是从程序的输出结果来看,尽管启动了两个线程对象,但是结果都是操纵了同一个资源,实现了资源共享的目的。
可见,实现Runnable接口相对于继承Thread类来说,有如下显著的优势:
(1)、 适合多个相同程序代码的线程去处理同一资源的情况,把虚拟CPU(线程)同程序的代码、数据有效分离,较好地体现了面向对象的设计思想。
(2)、 可以避免由于Java的单继承特性带来的局限。开发中经常碰到这样一种情况,即:当要将已经继承了某一个类的子类放入多线程中,由于一个类不能同时有两个父类,所以不能用继承Thread类的方式,那么就只能采用实现Runnable接口的方式了。
(3)、 增强了程序的健壮性,代码能够被多个线程共享,代码与数据是独立的。当多个线程的执行代码来自同一个类的实例时,即称它们共享相同的代码。多个线程可以操作相同的数据,与它们的代码无关。当共享访问相同的对象时,即共享相同的数据。当线程被构造时,需要的代码和数据通过一个对象作为构造函数实参传递进去,这个对象就是一个实现了Runnable接口的类的实例。
可以将一个Runnable接口的实例化对象作为参数去实例化Thread类对象。在实际的开发中,希望读者尽可能去使用Runnable接口去实现多线程机制。
java--创建多线程两种方法的比较的更多相关文章
- Java对象排序两种方法
转载:https://blog.csdn.net/wangtaocsdn/article/details/71500500 有时候需要对对象列表或数组进行排序,下面提供两种简单方式: 方法一:将要排序 ...
- java_线程创建的两种方法
线程创建的方法有两种: 一 继承Thread类: public class ThreadTest { public static void main(String[] args) { //4)在mai ...
- ubuntu 安装JAVA jdk的两种方法:
ubuntu 安装jdk 的两种方式: 1:通过ppa(源) 方式安装. 2:通过官网下载安装包安装. 这里推荐第1种,因为可以通过 apt-get upgrade 方式方便获得jdk的升级 使用pp ...
- java循环HashMap两种方法的效率比较
一.循环HashMap的两种方式 方式1: Iterator<Entry<String, String>> entryKeyIterator = entrySetMap.ent ...
- OC中动态创建可变数组的问题.有一个数组,数组中有13个元素,先将该数组进行分组,每3个元素为一组,分为若干组,最后用一个数组统一管理这些分组.(要动态创建数组).两种方法
<span style="font-size:24px;">//////第一种方法 // NSMutableArray *arr = [NSMutableArray a ...
- java中创建多线程两种方式以及实现接口的优点
多线程创建方式有两种 创建线程的第一种方式.继承Thread类 1.继承Thread类 2.重写Thread类中的run方法--目的将自定义代码存储在run方法.让线程执行3.调用线程的start() ...
- JAVA - 多线程 两种方法的比较
一.继承Thread类 实现方法: (1).首先定义一个类去继承Thread父类,重写父类中的run()方法.在run()方法中加入具体的任务代码或处理逻辑.(2).直接创建一个ThreadDemo2 ...
- java连接数据库的两种方法总结
方法一:使用jdbc-odbc桥连接sql server,作为中间媒介连接数据库 1.配置数据源:打开控制面版->管理工具->数据源(ODBC)->选用户DSN,按下添加按钮-> ...
- AJPFX总结线程创建的两种方法
创建线程的第一种方式:继承Thread ,由子类复写run方法.步骤:1,定义类继承Thread类:2,目的是复写run方法,将要让线程运行的代码都存储到run方法中:3,通过创建Thread类的子类 ...
随机推荐
- 拿出来分享了!VIP珍藏!!!全网最齐全的 DEDECMS模板 全盘下载地址列表!没有你找不到的!
拿出来分享了!VIP珍藏!!!全网最齐全的 DEDECMS模板 网盘地址!没有你找不到的! 模板类型最齐全: ----------------------优美的走起!------------ 一:DE ...
- 具体解释coredump
一,什么是coredump 我们常常听到大家说到程序core掉了,须要定位解决,这里说的大部分是指相应程序因为各种异常或者bug导致在执行过程中异常退出或者中止,而且在满足一定条件下(这里为什么说须要 ...
- 建立&修改视图
一.建立视图 IF OBJECT_ID('Sales.OrderTotalsByYear', 'V') IS NOT NULL DROP VIEW Sales.OrderTotalsByYear; G ...
- 对象作为返回值类型&&链式编程
package com.imooc; class Student{ public void study(){ System.out.println("学生学习"); } } cla ...
- Yii2 composer win7安装新建项目流程
一.首先下载 Composer-Setup.exe ,安装. 问题1:openSSL 问题,在php.ini 内去掉":"注释 问题2:browscap 问题 ,在php.ini ...
- [LeetCode]题解(python):026-Remove Duplicates from Sorted Array
题目来源: https://leetcode.com/problems/remove-duplicates-from-sorted-array/ 题意分析: 给定一个排好序的数组,去除重复的数,返回新 ...
- (Problem 35)Circular primes
The number, 197, is called a circular prime because all rotations of the digits: 197, 971, and 719, ...
- Mac平台编译mupdf-qt的开源项目
How to compile mupdf-qt Compile on Linux Install tools and thirdparty libraries You should install s ...
- codeblocks + MinGW 以及vc 使用预编译头文件的方法
MinGW编译器: 1.打开工程文件,在工程文件浏览其中,在你要设置为预编译的头文件上,点击鼠标右键,选择“属性(properties)” 你会看到一个多页面的属性框,选择“构建(build)”页面 ...
- C++ ofstream和ifstream详细用法
转载地址:http://soft.chinabyte.com/database/460/11433960.shtml ofstream是从内存到硬盘,ifstream是从硬盘到内存,其实所谓的流缓冲就 ...