JAVA多线程02-基础篇-线程创建方式

本节摘要:介绍创建线程的两种基本方式Thread,Runnable,并比较两者的区别和联系,最后通过实例进行演示

一、Thread 和 Runnable异同点

相同点 区别
可以实现多线程 1. Thread是类,Runnable是接口
2. 线程可以驱动任务(java编程思想),那么Thread是线程,Runnable是任务
3. Runnable可以实现资源共享

二、实现多线程的方式

2.1 Runnable:Runnable只包含一个接口,它实际上是一个函数式接口,可以通过实现Runnable接口来描述一种任务

@FunctionalInterface
public interface Runnable {
  public abstract void run();
}
实现多线程的方式为以下两步:

(1) class MyRunnable implements Runnable{}

(2) Thread t = new Thread(new MyRunnable()); t.start();

2.2 Thread:Thread实现了Runnable接口,它本身是一个类

public class Thread implements Runnable {}

实现多线程的方式为:

(1)class MyThread extends Thread{}

(2)Thread t = new MyThread(); t.start();

对于"Runnable是任务"这句话的理解:

查看Thread类的源码,发现Thread 的run()方法如下:

@Override
public void run() {
    if (target != null) {
      target.run();
    }
}
这里的target实际就是Runnable对象,通过Thread的构造函数传进来的

三、示例:我们以售卖mix2为例演示Thread 和Runnable的用法,假设本次只能售卖10台mix2

public class MyRunnable implements Runnable {

private int num = 10;

public static void main(String[] args) {

Runnable runnable = new MyRunnable();
      //runnable 可以实现资源共享,下面3个线程共享一个runnable,一共卖了10部Mix2
      Thread t1 = new Thread(runnable);
      Thread t2 = new Thread(runnable);
      Thread t3 = new Thread(runnable);
      t1.start();
      t2.start();
      t3.start();
}
@Override
public  void run() {
      for (int i = 0; i < 50; i++) {
          synchronized (this) {
            //2个线程
            if (this.num > 0) {
                  System.out.println(Thread.currentThread().getName() + ",num:" + num--);
            }
        }
    Thread.yield();
    }
  }
}

输出内容如下(输出会有不同):
Thread-0,num:10
Thread-1,num:9
Thread-1,num:8
Thread-1,num:7
Thread-1,num:6
Thread-1,num:5
Thread-1,num:4
Thread-1,num:3
Thread-1,num:2
Thread-1,num:1
可以看到,我们启动3个线程,共享一个runnable实例,一共只卖出10部mix2

下面以Thread为例:

public class ThreadExample extends Thread {

private int num = 10;

public static void main(String[] args) {
        ThreadExample t1 = new ThreadExample();
        ThreadExample t2 = new ThreadExample();
        ThreadExample t3 = new ThreadExample();
        t1.start();
        t2.start();
        t3.start();
}

public void run() {
            for (int i = 0; i < 20; i++) {
                       if (num > 0) {
                                System.out.println(Thread.currentThread().getName()+"---"+num--);
                          }
                    }
            }
}
输出结果:
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---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
Thread-2---10
Thread-2---9
Thread-2---8
Thread-2---7
Thread-2---6
Thread-2---5
Thread-2---4
Thread-2---3
Thread-2---2
Thread-2---1
可以看到,每个线程都卖出10部mix2,这不符合我们的预期 

四、总结

继承Thread和实现Runnable接口都可以实现多线程,Runnable可以实现资源共享

转载请注明作者及出处,并附上链接http://www.jianshu.com/u/ada8c4ee308b

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,524评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,869评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,813评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,210评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,085评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,117评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,533评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,219评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,487评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,582评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,362评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,218评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,589评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,899评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,176评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,503评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,707评论 2 335

推荐阅读更多精彩内容

  • 概要 本章,我们学习“常用的实现多线程的2种方式”:Thread和Runnable。 之所以说是常用的,是因为通过...
    博格体阅读 348评论 0 0
  • 写在前面的话: 这篇博客是我从这里“转载”的,为什么转载两个字加“”呢?因为这绝不是简单的复制粘贴,我花了五六个小...
    SmartSean阅读 4,707评论 12 45
  • 本文主要讲了java中多线程的使用方法、线程同步、线程数据传递、线程状态及相应的一些线程函数用法、概述等。 首先讲...
    李欣阳阅读 2,426评论 1 15
  • Java多线程学习 [-] 一扩展javalangThread类 二实现javalangRunnable接口 三T...
    影驰阅读 2,943评论 1 18
  • 天黑路滑,社会复杂人心险恶,居心叵测。
    谢sir说阅读 366评论 0 0