(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. @Override
  11. 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. @Override
  26. 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. @Override
  10. 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. }
  1. package com.mycloud.demo.thread;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. import java.util.concurrent.Callable;
  6. import java.util.concurrent.ExecutionException;
  7. import java.util.concurrent.ExecutorService;
  8. import java.util.concurrent.Executors;
  9. import java.util.concurrent.Future;
  10.  
  11. class CallableDemo implements Callable<String> {
  12.  
  13. private int i = 1;
  14.  
  15. CallableDemo() {
  16. System.out.println("Creating " + Thread.currentThread().getName());
  17. }
  18.  
  19. @Override
  20. public String call() {
  21. System.out.println("Running " + Thread.currentThread().getName());
  22. try {
  23. for (; i <= 5; i++) {
  24. System.out.println("Thread: " + Thread.currentThread().getName() + " [" + i + "]");
  25. Thread.sleep((int) (Math.random() * 100));
  26. }
  27. } catch (InterruptedException e) {
  28. System.out.println("Thread " + Thread.currentThread().getName() + " interrupted.");
  29. return "failed";
  30. }
  31. System.out.println("Thread " + Thread.currentThread().getName() + " exiting.");
  32. return "success";
  33. }
  34. }
  35.  
  36. public class TestCallable {
  37.  
  38. public static void main(String args[]) {
  39.  
  40. ExecutorService ex = Executors.newFixedThreadPool(5);
  41. List<Future<String>> futures = new ArrayList<>();
  42. futures.add(ex.submit(new CallableDemo()));
  43. futures.add(ex.submit(new CallableDemo()));
  44.  
  45. try {
  46. for (Future<String> future : futures) {
  47. System.out.println(future.get());
  48. }
  49. } catch (InterruptedException | ExecutionException e) {
  50. e.printStackTrace();
  51. } finally {
  52. ex.shutdown();
  53. }
  54. }
  55. }

Java多线程(1):3种常用的实现多线程类的方法的更多相关文章

  1. 用python介绍4种常用的单链表翻转的方法

    这里给出了4种4种常用的单链表翻转的方法,分别是: 开辟辅助数组,新建表头反转,就地反转,递归反转 # -*- coding: utf-8 -*- ''' 链表逆序 ''' class ListNod ...

  2. 23种常用设计模式的UML类图

    23种常用设计模式的UML类图 本文UML类图参考<Head First 设计模式>(源码)与<设计模式:可复用面向对象软件的基础>(源码)两书中介绍的设计模式与UML图. 整 ...

  3. 转载:23种常用设计模式的UML类图

    转载至:https://www.cnblogs.com/zytrue/p/8484806.html 23种常用设计模式的UML类图 本文UML类图参考<Head First 设计模式>(源 ...

  4. Java多线程(二)——常用的实现多线程的两种方式

    一.继承Thread类创建线程类 Java使用Thread类代表线程,所有的线程对象都必须是Thread类或其子类的实例.每个线程的作用是完成一定的任务,实际上就是执行一段程序流即一段顺序执行的代码. ...

  5. java单例模式(两种常用模式)

    单例模式是java中常见的设计模式 特点: 单例类只能有一个实例 单例类必须自己创建自己的唯一实例 单例类必须给所有的其他对象提供这一实例 单例模式是某个类只能有一个实例而且自动实例化并且向整个系统提 ...

  6. Javascript中两种最通用的定义类的方法

    在Javascript中,一切都是对象,包括函数.在Javascript中并没有真正的类,不能像C#,PHP等语言中用 class xxx来定义.但Javascript中提供了一种折中的方案:把对象定 ...

  7. java开发过程中几种常用算法

    排序算法 排序算法中包括:简单排序.高级排序 简单排序 简单排序常用的有:冒泡排序.选择排序.插入排序 冒泡排序代码如下: private static void bubbleSrot(int[] a ...

  8. 用 Java 实现的八种常用排序算法

    八种排序算法可以按照如图分类 交换排序 所谓交换,就是序列中任意两个元素进行比较,根据比较结果来交换各自在序列中的位置,以此达到排序的目的. 1. 冒泡排序 冒泡排序是一种简单的交换排序算法,以升序排 ...

  9. Java中的几种常用循环

     循环的条件 反复执行一段相同或相似的代码 一     for循环        先判断,再执行   代码示例为 ① for (int i = 0; i < args.length; i++) ...

随机推荐

  1. chrome插件开发-notification API注意事项

    1.win10系统,在系统设置里面,设置开启Google Chrome通知 2.iconUrl必须设置,且图片为ico格式

  2. axios时遇到的Request Method: OPTIONS

    前言 在请求axios 请求数据的时候,会出现options的,是因为请求是分为简单请求和复杂请求. 简单请求 满足下面两个条件的请求是简单请求: 请求方式是以下三种之一: HEAD GET POST ...

  3. php类知识点滴---魔术方法,系统在特定时机触发的方法

    __get()获取私有或受保护属性时调用的方法 <?php class coach { private $chairfit = "徐晓冬"; public function ...

  4. 网页分享到微信、微博、QQ空间、百度贴吧等

    1.首先说明的是,pc端微信分享只能通过二维码来分享. 2.下面是js代码. //分享到新浪微博 function shareToSinaWB(event){ event.preventDefault ...

  5. Win7安装VS2019

    SP1 补丁 WIN7安装VS2019需要更新两个补丁才能顺利安装,否则会闪退. KB4474419 KB4490628 https://zhidao.baidu.com/question/18026 ...

  6. [Python之路] 日志操作

    使用logging模块来写日志 日志直接输出到准备输出 import logging logging.basicConfig(level=logging.WARNING, format="% ...

  7. pdf缩略图生成上传解决方案

    前言:因自己负责的项目(jetty内嵌启动的SpringMvc)中需要实现文件上传,而自己对java文件上传这一块未接触过,且对 Http 协议较模糊,故这次采用渐进的方式来学习文件上传的原理与实践. ...

  8. convert:图片转pdf失败

     造冰箱的大熊猫@cnblogs 2019/1/21 1.环境 操作系统/Ubuntu 16.04.5 LTS,内核/4.15.0-43-generic,convert/ImageMagick 6.8 ...

  9. 2018 焦作网络赛 K Transport Ship ( 二进制优化 01 背包 )

    题目链接 题意 : 给出若干个物品的数量和单个的重量.问你能不能刚好组成总重 S 分析 : 由于物品过多.想到二进制优化 其实这篇博客就是存个二进制优化的写法 关于二进制优化的详情.百度一下有更多资料 ...

  10. Mysql模拟故障恢复案例过程

    一.数据库全备,全备脚本如下: [root@leader script]# cat bak_all.sh #!/bin/bash#Date: 2019-12-08#Author: chan#Mail: ...