Java Thread Example

英文原文 : Java Thread Example - Extending Thread Class and Implementing Runnable Interface

程序运行的基础单元就是 进程线程。Java多线程编程主要针对线程。

进程

一个进程有着独立的运行环境,我们可以把进程看作一个程序或者一个应用。进程中包含着若干个线程。JRE会以单个进程的方式启动,但是会包含若干个Class以及线程。

线程

线程可以看作轻量级进程。创建一个线程只需要少量的资源,一个进程中的多个线程可以互相共享进程中的资源。

Java多线程

任何一个Java应用都至少拥有一个线程 -- main thread。当然也有许多运行在后台的线程,诸如:内存管理,系统管理,信号通信管理等等。但一个程序启动都是通过main thread,我们可以通过它来创建多个线程。

多线程是指两个或者两个以上线程同时运行在一个程序中。在单核CPU中,通过分时分片占用CPU的方式来达到多个线程同时运行的效果。

多线程的优点

  1. 相比进程,多线程更加轻量,创建一个线程比创建一个进程花费更少的资源。
  2. 线程可以共享父线程中的资源和字节码。
  3. 多个线程之间的环境转换相比进程开销更小。
  4. 线程之间的相互通信相比进程更加容易。

Java提供两种编程方式创建一个线程

  1. 实现java.lang.Runnable接口。
  2. 继承java.lang.Thread类。

实现Runnable接口创建线程例子

实现Runnable接口并重写其

 public void run();

方法就可以创建一个线程类。若想把这个类当作一个线程运行起来,我们需要通过类对象来创建一个线程对象,然后调用start() 方法,在一个单独的线程来执行run() 方法。

下面是一个实例代码:
HeavyWorkRunnable.java

package com.journaldev.threads;

public class HeavyWorkRunnable implements Runnable {

    @Override
    public void run() {
        System.out.println("Doing heavy processing - START "+Thread.currentThread().getName());
        try {
            Thread.sleep(1000);
            //Get database connection, delete unused data from DB
            doDBProcessing();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("Doing heavy processing - END "+Thread.currentThread().getName());
    }

    private void doDBProcessing() throws InterruptedException {
        Thread.sleep(5000);
    }

}

通过继承Thread类来创建一个线程

我们可以继承java.lang.Thread类,并重写其run() 方法。这样我们可以实例化此类,调用start() 方法来执行run方法中的代码。

例子代码: MyThread.java

package com.journaldev.threads;

public class MyThread extends Thread {

    public MyThread(String name) {
        super(name);
    }

    @Override
    public void run() {
        System.out.println("MyThread - START "+Thread.currentThread().getName());
        try {
            Thread.sleep(1000);
            //Get database connection, delete unused data from DB
            doDBProcessing();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("MyThread - END "+Thread.currentThread().getName());
    }

    private void doDBProcessing() throws InterruptedException {
        Thread.sleep(5000);
    }

}

下面的代码是展示如何执行:ThreadRunExample.java

package com.journaldev.threads;

public class ThreadRunExample {

    public static void main(String[] args){
        Thread t1 = new Thread(new HeavyWorkRunnable(), "t1");
        Thread t2 = new Thread(new HeavyWorkRunnable(), "t2");
        System.out.println("Starting Runnable threads");
        t1.start();
        t2.start();
        System.out.println("Runnable Threads has been started");
        Thread t3 = new MyThread("t3");
        Thread t4 = new MyThread("t4");
        System.out.println("Starting MyThreads");
        t3.start();
        t4.start();
        System.out.println("MyThreads has been started");

    }
}

上面的代码执行结果如下:

Starting Runnable threads
Runnable Threads has been started
Doing heavy processing - START t1
Doing heavy processing - START t2
Starting MyThreads
MyThread - START Thread-0
MyThreads has been started
MyThread - START Thread-1
Doing heavy processing - END t2
MyThread - END Thread-1
MyThread - END Thread-0
Doing heavy processing - END t1

当我们开启一个线程后,它的执行时间和片区是交于系统来决定的,我们并不可以控制其运行。但是我们可以设置一个线程的优先级遗憾的是,即使设置了线程的优先级,也并不能保证优先级高的线程就一定会被先执行。

Runnable vs Thread

如果你想使你的程序更加的灵活,那么你最好实现Runnable接口来创建一个线程类。若你只是为了你只是为了创建一个线程这唯一个目的的话,可以使用继承Thread的方法。

由于Java不支持多继承这种情况发生,所以实现Runnable接口可以让你这个类在以后的开发中,继承其他类。

正如你观察的那样,一个线程运行起来的时候, 并不会返回结果,是一个void方法,那如果我们想得到线程运行后返回结果请点击下面的链接Java Callable Future

在最新的Java8中,Runnable类是一个Functional Interface ,我们可以使用Lambda表达式去重写run() 方法而不是使用传统的匿名类的方式。

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

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,604评论 18 399
  • Java多线程学习 [-] 一扩展javalangThread类 二实现javalangRunnable接口 三T...
    影驰阅读 2,952评论 1 18
  • 下面是我自己收集整理的Java线程相关的面试题,可以用它来好好准备面试。 参考文档:-《Java核心技术 卷一》-...
    阿呆变Geek阅读 14,785评论 14 507
  • 没有过这么失败的旅程 好想哭
    1谷l阅读 144评论 0 0
  • 夜,是一个人的 星呢? 是所有的孩子的礼物, 那, 给我一杯金色的阳光或满帆的劲风吧! 等,天明 将遗留下的所有包...
    南纬以北的猫阅读 251评论 0 0