Java多线程(1):3种常用的实现多线程类的方法

(1) 继承java.lang.Thread类(Thread也实现了Runnable接口)

继承Thread类的方法是比较常用的一种,如果说你只是想起一条线程。没有什么其它特殊的要求,那么可以使用Thread。一般推荐Runable。Thread类实际上也是实现了Runnable接口的类。

1 class ThreadDemo extends Thread { 2  3     private int i = 1; 4  5     ThreadDemo(String name) { 6         this.setName(name); 7         System.out.println("Creating " + name); 8     } 9 10     @Override11     public void run() {12         System.out.println("Running " + this.getName());13         try {14             for (; i <= 5; i++) {15                 System.out.println("Thread: " + this.getName() + " [" + i + "]");16                 // Thread.sleep()方法调用目的是不让当前线程独自霸占该进程所获取的CPU资源,以留出一定时间给其他线程执行的机会。17                 Thread.sleep((int) (Math.random() * 100));18             }19         } catch (InterruptedException e) {20             System.out.println("Thread " + this.getName() + " interrupted.");21         }22         System.out.println("Thread " + this.getName() + " exiting.");23     }24 25     @Override26     public void start() {27         System.out.println("Starting " + this.getName());28         super.start();29     }30 }31 32 // 程序启动运行main时候,java虚拟机启动一个进程,主线程main在main()调用时候被创建。33 // 随着调用ThreadDemo的两个对象的start方法,另外两个线程也启动了,这样,整个应用就在多线程下运行。34 public class TestThread {35     public static void main(String args[]) {36         ThreadDemo t1 = new ThreadDemo("Thread-1");37         // start()方法的调用后并不是立即执行多线程代码,而是使得该线程变为可运行态(Runnable),什么时候运行是由操作系统决定的。38         t1.start();39         ThreadDemo t2 = new ThreadDemo("Thread-2");40         t2.start();41     }42 }

(2) 直接实现java.lang.Runnable接口

通过实现Runnable接口,使得该类有了多线程类的特征。run()方法是多线程程序的一个约定。所有的多线程代码都在run方法里面。

在启动的多线程的时候,需要先通过Thread类的构造方法Thread(Runnable target) 构造出对象,然后调用Thread对象的start()方法来运行多线程代码。

如果一个类继承Thread,则不适合资源共享。但是如果实现了Runable接口的话,则很容易的实现资源共享。

1 class RunnableDemo implements Runnable { 2  3     private int i = 1; 4  5     RunnableDemo() { 6         System.out.println("Creating" + Thread.currentThread().getName()); 7     } 8  9     @Override10     public void run() {11         System.out.println("Running " + Thread.currentThread().getName());12         try {13             for (; i <= 5; i++) {14                 System.out.println("Thread: " + Thread.currentThread().getName() + " [" + i + "]");15                 Thread.sleep((int) (Math.random() * 100));16             }17         } catch (InterruptedException e) {18             System.out.println("Thread " + Thread.currentThread().getName() + " interrupted.");19         }20         System.out.println("Thread " + Thread.currentThread().getName() + " exiting.");21     }22 }23 24 public class TestRunnable {25 26     public static void main(String args[]) {27         Runnable r1 = new RunnableDemo();28         Thread t1 = new Thread(r1);29         t1.setName("Thread-1");30         t1.start();31 32         Runnable r2 = new RunnableDemo();33         Thread t2 = new Thread(r2);34         t2.setName("Thread-2");35         t2.start();36     }37 }
package com.mycloud.demo.thread;import java.util.ArrayList;import java.util.List;import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Future;class CallableDemo implements Callable<String> {    private int i = 1;    CallableDemo() {        System.out.println("Creating " + Thread.currentThread().getName());    }    @Override    public String call() {        System.out.println("Running " + Thread.currentThread().getName());        try {            for (; i <= 5; i++) {                System.out.println("Thread: " + Thread.currentThread().getName() + " [" + i + "]");                Thread.sleep((int) (Math.random() * 100));            }        } catch (InterruptedException e) {            System.out.println("Thread " + Thread.currentThread().getName() + " interrupted.");            return "failed";        }        System.out.println("Thread " + Thread.currentThread().getName() + " exiting.");        return "success";    }}public class TestCallable {    public static void main(String args[]) {        ExecutorService ex = Executors.newFixedThreadPool(5);        List<Future<String>> futures = new ArrayList<>();        futures.add(ex.submit(new CallableDemo()));        futures.add(ex.submit(new CallableDemo()));        try {            for (Future<String> future : futures) {                System.out.println(future.get());            }        } catch (InterruptedException | ExecutionException e) {            e.printStackTrace();        } finally {            ex.shutdown();        }    }}
(0)

相关推荐

  • 1.3currentThread()方法

    该方法可返回代码段正在被哪个线程调用的信息 1 package com.cky.test; 2 3 /** 4 * Created by chenkaiyang on 2017/12/2. 5 */ ...

  • 多线程(二)线程的同步

    举例:创建三个卖票窗口,共有一百张票,完成售票 问题:卖票的过程中,出现了重票.错票 --> 出现了线程的安全问题 问题出现的原因:当某个线程操作车票的过程中,尚未操作完成时,其他线程参与进来, ...

  • 实用技术‖几种常用涂白剂及其调制方法

    秋冬季对园林树木树干进行涂白,可有效防御冻害,阻止病虫在树干上越冬,并杀死在树干上越冬的病虫害.现介绍几种常用涂白剂的配制比例与调制方法. 硫酸铜石灰涂白剂 ⑴配方比例:硫酸铜10千克.生石灰200千 ...

  • 几种常用杀菌剂的特性及使用方法

    关注化肥农药助手这里尽是干货! 免费查农药化肥真假.看农资报价.作物病虫害防治,经销商农户必备:实用的植保文章分享平台!投稿/合作请加QQ:5414402 代森锌 1.作用特点:原药为灰白色或淡黄色粉 ...

  • 5种常用卤水口味,香料配制方法:清香,浓香,麻辣,香辣,麻香

    5种常用卤水口味,香料配制方法:清香,浓香,麻辣,香辣,麻香

  • 几种常用杀菌剂的特性及使用方法!

    代森锌 1.作用特点:原药为灰白色或淡黄色粉末,有臭鸡蛋味.是一种保护性杀菌剂,对霜霉病菌.晚疫病菌及炭疽病菌等多种病菌有较强的触杀作用.其有效成分在水中易被氧化成异硫氰化合物,对病原菌体内含有-SH ...

  • 【实务】“五种”常用的线索处置情况审核方法

    来源:中央纪委国家监委官网:作者:胡胜华,湖北省武汉市纪委监委 .转载用作学习,如有问题请及时联系处理. 线索处置情况审核有 哪些常用方法 问题线索处置是监督执纪执法工作的源头,关乎反腐败成效.严格对 ...

  • 五种常用中药材的高产栽培技术方法

    随着中医药业的发展,中药材生产开始走俏,表现出良好的经济效益.本文总结几年的生产实践,针对北方地区生产常用的具有较强的抗旱性和适应性的根用性中药材板蓝根.丹参.黄芩.桔梗.柴胡等五个品种进行高产栽培技 ...

  • 4种常用Java线程锁的特点,性能比较、使用场景 – mikechen的互联网架构师之路

    多线程的缘由 在出现了进程之后,操作系统的性能得到了大大的提升.虽然进程的出现解决了操作系统的并发问题,但是人们仍然不满足,人们逐渐对实时性有了要求. 使用多线程的理由之一是和进程相比,它是一种非常花 ...

  • 你“不能不知道”的10种常用价廉中成药,...

    你"不能不知道"的10种常用价廉中成药,为你省下一半住院费,赶紧收藏. 1.益胆片--消炎解热.解痉镇痛--[不能不知道] 2.利肝片--清肝利胆.除湿退黄--[不能不知道] 3. ...

  • 5种常用的拍摄构图方法!快收藏~

    摄影中构图的方法和种类很多,多达十几种,我们今天就介绍5个常用的构图方法. 要知道掌握了这些构图方法,百分之90以上的题材拍摄都可以运用自如啦! 三分线构图 又称九宫格构图,将画面利用横竖两条线分为九 ...