Java值创建线程的两种方式对比
在Java中创建线程的方式有两种,第一种是直接继承Thead类,另一种是实现Runable接口。那么这两种方式孰优孰劣呢?
采用继承Thead类实现多线程:
优势:编写简单,如果需要访问当前线程,只需使用this即可,无需使用Thead.currentThread()方法。
劣势:因为这种线程类已经继承了Thead类,所以不能再继承其它类。
示例代码:
1: package org.frzh.thread;
2:
3: public class FirstThread extends Thread{
4: private int i;
5:
6: //重写run方法,run方法的方法体就是线程执行体
7: public void run() {
8: for (; i < 100; i++) {
9: //当线程类继承Thread类时,可以直接调用getName方法获得当前线程名
10: //如果想获得当前线程,直接使用this
11: //Thread对象的getName方法返回当前线程的名字
12: System.out.println(getName() + " " + i);
13: }
14: }
15:
16: public static void main(String[] args) {
17: for (int i = 0; i < 100; i++) {
18: //调用Thead的currentThread方法获取当前线程
19: System.out.println(Thread.currentThread().getName() + " " +i);
20: if (i == 20) {
21: new FirstThread().start();
22: new FirstThread().start();
23: }
24: }
25: }
26: }
运行结果片段:

我们发现,在两个子线程中i的值并不连续,似乎与我们说的子线程直接共享数据不符。其实,在这里我们实例化了两个子线程,每个拥有自己的实例变量i。
采用实现Runable接口的多线程:
优势:线程类只是实现了Runable接口,因此还可以继承其他类;
在这种情况下,可以使多个线程共享一个target对象,所以非常适合多个线程用来处理同一份资源的情况,从而可以将cpu、代码和数据分开,形成清晰的模型,较好的体现面向对象思想。
劣势:编程略有些复杂,如果要访问当前线程必须使用Thread.currentThread方法。
示例代码:
1: package org.frzh.thread;
2:
3: public class SecondThread implements Runnable{
4: private int i;
5:
6: @Override
7: public void run() {
8: // TODO Auto-generated method stub
9: for (; i < 100; i++) {
10: System.out.println(Thread.currentThread().getName() + " " + i);
11: }
12: }
13:
14: public static void main(String[] args) {
15: for (int i = 0; i < 100; i++) {
16: System.out.println(Thread.currentThread().getName() + " " + i);
17: if (i == 20) {
18: SecondThread st = new SecondThread();
19: new Thread(st, "子线程1").start();
20: new Thread(st, "子线程2").start();
21: }
22: }
23: }
24:
25: }
运行结果片段:

可以看到,此时的i值是连续变化的,因为线程1和2共享同一个target。
Java值创建线程的两种方式对比的更多相关文章
- Java中创建线程的两种方式
创建线程的第一种方式: 创建一个类继承Thread 重写Thread中的run方法 (创建线程是为了执行任务 任务代码必须有存储位置,run方法就是任务代码的存储位置.) 创建子类对象,其实就是在创建 ...
- Java多线程——创建线程的两种方式
创建线程方式一:继承Thread类. 步骤:1,定义一个类继承Thread类.2,覆盖Thread类中的run方法.3,直接创建Thread的子类对象创建线程.4,调用start方法开启线程并调用线程 ...
- 【Java】创建线程对象两种方式
1.继承Thread类,重载run方法: Thread t = new Thread(new Runnable() { @Override public void run() { // TODO Au ...
- 【java并发】传统线程技术中创建线程的两种方式
传统的线程技术中有两种创建线程的方式:一是继承Thread类,并重写run()方法:二是实现Runnable接口,覆盖接口中的run()方法,并把Runnable接口的实现扔给Thread.这两种方式 ...
- Java并发基础01. 传统线程技术中创建线程的两种方式
传统的线程技术中有两种创建线程的方式:一是继承Thread类,并重写run()方法:二是实现Runnable接口,覆盖接口中的run()方法,并把Runnable接口的实现扔给Thread.这两种方式 ...
- 创建线程的两种方式比较Thread VS Runnable
1.首先来说说创建线程的两种方式 一种方式是继承Thread类,并重写run()方法 public class MyThread extends Thread{ @Override public vo ...
- java创建线程的两种方式及源码解析
创建线程的方式有很多种,下面我们就最基本的两种方式进行说明.主要先介绍使用方式,再从源码角度进行解析. 继承Thread类的方式 实现Runnable接口的方式 这两种方式是最基本的创建线程的方式,其 ...
- Java 多线程 创建线程的4种方式
1 继承Thread类,重写run方法.Thread类实现了Runnable接口. 2 实现Runnable接口,重写run方法.相比于继承Thread类,可以避免单继承的缺陷和实现资源共享. 举例: ...
- Java中创建线程的三种方式以及区别
在java中如果要创建线程的话,一般有3种方法: 继承Thread类: 实现Runnable接口: 使用Callable和Future创建线程. 1. 继承Thread类 继承Thread类的话,必须 ...
随机推荐
- Shell学习之Shift的用法
位置参数可以用shift命令左移.比如shift 3表示原来的$4现在变成$1,原来的$5现在变成$2等等,原来的$1.$2.$3丢弃,$0不移动.不带参数的shift命令相当于shift 1 ...
- apache配置gzip模式(转)
最近在看有关提高website性能的书,个人觉得挺不错的两本书: <<high performance websites>> <<even faster websi ...
- python核心编程-第四章-个人笔记
1.所有的python对象都拥有三个特性: ①身份:每个对象都有唯一的身份标识自己,可用内建函数id()来得到.基本不会用到,不用太关心 >>> a = 2 >>> ...
- 使用notepad++学习python爬虫,print网页中文乱码问题
今天学习使用python爬虫的时候发现爬到的网页中文会乱码,一直网上搜索解决办法,一个一个试验过去,发现还是乱码,然后我就开始使用其它方法测试,用python自带的编辑器打开是正常的,发现是notep ...
- SQL Server 控制锁升级
背景知识: 锁升级的路线图.行--> 页 --> 区(extent)-->区(表分区)--> 表: alter table 控制锁的升级行为: 1.table SQL Serv ...
- 混合使用Azure LB和ILB访问相同web服务(3)
接下来我们来配置Azure Load balancer,就是面向公网的负载均衡器: 1.在该测试中,为了保持内网访问和外网访问一样的体验,本地端口和public端口和ILB一样,同样是80: PS C ...
- Oracle EBS-SQL (CST-4):检查组织间项目成本.sql
select i1.segment1 项 ...
- Learn LIBSVM---a practical Guide to SVM classification
想学习一下SVM,所以找到了LIBSVM--A Library for Support Vector Machines,首先阅读了一下网站提供的A practical guide to SVM cla ...
- Inno Setup:获取isl中的多国语言字串
原文 http://zwkufo.blog.163.com/blog/static/25882512010101041626803/?suggestedreading&wumii 用InnoS ...
- mfc窗口,父窗口parentwindow,所有者窗口ownerwindow 区别
一. parent:创建者,owner:所有者 小玉的父母生下小玉,养到8岁,卖给贾府当丫头小玉的父母是parent,贾府是owner 二. 1.Pop-up窗口: 一个弹出窗口是必须具有WS_POP ...