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类的话,必须 ...
随机推荐
- B - 敌兵布阵 线段树的点
B - 敌兵布阵 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Descriptio ...
- asp.net后台向前端输出js脚本的三种方法
//这个方法最快,因为它会输出到html标签之前 Response.Write("<script type='text/javascript'>alert('这个最快')< ...
- input type file onchange上传文件的过程中,遇到同一个文件二次上传无效的问题。
不要采用删除当前input[type=file]这个节点,然后再重新创建dom这种方案,这样是不合理的.解释如下:input[type=file]使用的是onchange去做,onchange监听的为 ...
- Mobile Matrices
This is an attempt to compile a list of relevant specifications for all modern smart phones and mobi ...
- YUM更换源--yum找不到安装包(转)
公司提供的CentOS VM中,/etc/yum.repos.d 下 只有一个build.repo,其中提供的yum 源只有公司内部的几个源,很多包在这些源中都找不到.于是要添加别的源,下面的帖子中介 ...
- 钱币兑换问题(hd1284)
钱币兑换问题 在一个国家仅有1分,2分,3分硬币,将钱N兑换成硬币有很多种兑法.请你编程序计算出共有多少种兑法. Input 每行只有一个正整数N,N小于32768. Output 对应每个输 ...
- racle undo 解析
racle undo 解析 声明一下:关于oracle的文章基于boobooke小布老师视频,在我学习的过程中,每有体会拿来分享,虽然从理解到整理分享很耗时,但我想这样的学习是扎实的. Undo是干嘛 ...
- C# Chart 折线图 多条数据展示
private void btn_Click(object sender, EventArgs e) { DBHelper db = new DBHelper(); DataSet ds = db.G ...
- Oracle EBS-SQL (BOM-18):检查BOM与工艺路线对照.sql
/*有工艺路线,无BOM清单*/ select msi.segment1, msi.description from apps.BOM_OPERATIONAL_ROUTINGS bor, apps.m ...
- 2.6. Statistical Models, Supervised Learning and Function Approximation
Statical model regression $y_i=f_{\theta}(x_i)+\epsilon_i,E(\epsilon)=0$ 1.$\epsilon\sim N(0,\sigma^ ...