Java多线程实现方式:1.实现Runnable接口2.继承Thread类,虽然是比较基础的知识点,作为学习记录写下来,高手略过!

1.实现Runnable接口

1) RunnableDemo类

package com.wicresoft.demo;public class RunnableDemo implements Runnable {private Thread t;private String threadName;RunnableDemo(String name){this.threadName = name;System.out.println("Creating " + threadName);}@Overridepublic void run() {// TODO Auto-generated method stubSystem.out.println("Running " + threadName);try{for(int i = 4; i > 0; i--){System.out.println("Thread: " + threadName + "," + i);//thread sleep for a whileThread.sleep(50);}}catch(InterruptedException e){System.out.println("Running " + threadName);}System.out.println("Thread " + threadName + "exiting.");}public void start(){System.out.println("Starting " +  threadName );if (t == null){t = new Thread (this, threadName);t.start ();}}
}

2)TestThread类

package com.wicresoft.demo;public class TestThread {/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stubRunnableDemo R1 = new RunnableDemo("Thread-1");R1.start();RunnableDemo R2 = new RunnableDemo("Thread-2");R2.start();}
}

3)输出

Creating Thread-1
Starting Thread-1
Creating Thread-2
Starting Thread-2
Running Thread-1
Thread Thread-1,4
Running Thread-2
Thread Thread-2,4
Thread Thread-1,3
Thread Thread-2,3
Thread Thread-2,2
Thread Thread-1,2
Thread Thread-2,1
Thread Thread-1,1
Thread Thread-2 exiting.
Thread Thread-1 exiting.

2.继承Thread

1)ThreadDemo

package com.wicresoft.demo2;public class ThreadDemo extends Thread {private Thread t;private String threadName;ThreadDemo(String name){this.threadName = name;System.out.println("Creating " +  threadName );}public void run() {System.out.println("Running " +  threadName );try {for(int i = 4; i > 0; i--) {System.out.println("Thread: " + threadName + ", " + i);// Let the thread sleep for a while.Thread.sleep(50);}} catch (InterruptedException e) {System.out.println("Thread " +  threadName + " interrupted.");}System.out.println("Thread " +  threadName + " exiting.");}public void start(){System.out.println("Starting " +  threadName );if (t == null){t = new Thread (this, threadName);t.start ();}}
}

2)TestThread类

package com.wicresoft.demo2;public class TestThread {/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stubThreadDemo T1 = new ThreadDemo( "Thread-1");T1.start();ThreadDemo T2 = new ThreadDemo( "Thread-2");T2.start();}
}

3)输出

Creating Thread-1
Starting Thread-1
Creating Thread-2
Starting Thread-2
Running Thread-1
Thread: Thread-1, 4
Running Thread-2
Thread: Thread-2, 4
Thread: Thread-1, 3
Thread: Thread-2, 3
Thread: Thread-1, 2
Thread: Thread-2, 2
Thread: Thread-1, 1
Thread: Thread-2, 1
Thread Thread-1 exiting.
Thread Thread-2 exiting.

3.关于线程优先级

Java线程的优先级是一个整数,其取值范围是1 (Thread.MIN_PRIORITY ) - 10 (Thread.MAX_PRIORITY ),默认优先级是5.

线程组最大优先级的设定:
->系统线程组的最大优先级默认为Thread.MAX_PRIORITY
->创建线程组的时候其最大优先级默认为父线程组(如果未指定父线程组,则其父线程组默认为当前线程所属线程组)的最大优先级
->可以通过setMaxPriority更改最大优先级,但无法超过父线程组的最大优先级

对于线程优先级,我们需要注意:
* Thread.setPriority()可能根本不做任何事情,这跟你的操作系统和虚拟机版本有关
* 线程优先级对于不同的线程调度器可能有不同的含义,可能并不是你直观的推测。特别地,优先级并不一定是指CPU的分享。在UNIX系统,优先级或多或少可以认为是CPU的分配,但Windows不是这样
* 线程的优先级通常是全局的和局部的优先级设定的组合。Java的setPriority()方法只应用于局部的优先级。换句话说,你不能在整个可能的范围 内设定优先级。(这通常是一种保护的方式,你大概不希望鼠标指针的线程或者处理音频数据的线程被其它随机的用户线程所抢占)
* 不同的系统有不同的线程优先级的取值范围,但是Java定义了10个级别(1-10)。这样就有可能出现几个线程在一个操作系统里有不同的优先级,在另外一个操作系统里却有相同的优先级(并因此可能有意想不到的行为)
* 操作系统可能(并通常这么做)根据线程的优先级给线程添加一些专有的行为(例如”only give a quantum boost if the priority is below X“)。这里再重复一次,优先级的定义有部分在不同系统间有差别。
* 大多数操作系统的线程调度器实际上执行的是在战略的角度上对线程的优先级做临时操作(例如当一个线程接收到它所等待的一个事件或者I/O),通常操作系统知道最多,试图手工控制优先级可能只会干扰这个系统。
* 你的应用程序通常不知道有哪些其它进程运行的线程,所以对于整个系统来说,变更一个线程的优先级所带来的影响是难于预测的。例如你可能发现,你有一个预期 为偶尔在后台运行的低优先级的线程几乎没有运行,原因是一个病毒监控程序在一个稍微高一点的优先级(但仍然低于普通的优先级)上运行,并且无法预计你程序 的性能,它会根据你的客户使用的防病毒程序不同而不同。

实际编码注意事项
不要假定高优先级的线程一定先于低优先级的线程执行,不要有逻辑依赖于线程优先级,否则可能产生意外结果!

Java多线程实现的两种方式相关推荐

  1. JAVA多线程实现的三种方式

    文章目录 继承Thread类实现多线程 实现Runnable接口方式实现多线程 区别 ExecutorService/Callable/Future实现有返回结果的多线程 步骤 概念 实例(可忽略) ...

  2. 创建和应用Java包文件的两种方式(转)

    创建和应用Java包文件的两种方式(转) <Java编程艺术>章节选登.作者:高永强 清华大学出版社 (即将出版) 12.1  包--package    ... 12.1.1  包命名规 ...

  3. java制作oracle程序,Java程序操作Oracle两种方式之简单实现

    Java程序操作Oracle两种方式之简单实现 1.通过JDBC-ODBC桥连接Oracle数据库 (1)创建odbc源,在控制面板->管理工具->数据源(odbc)中添加DSN,比如取名 ...

  4. Java 实现抽奖的两种方式

    Java实现抽奖的两种方式 方式一:随机数在哪个区间内返回区间下标 方式二:随机数加入区间点集合排序返回随机数下标 代码示例: ①抽奖入参类型为BigDecimal: package com.cfay ...

  5. Java格式化倒计时的两种方式

    Java格式化倒计时的两种方式 第一种方式 /*** 入参是一个每秒减小1的秒数* 返回一个格式化的时间* * 该方法具有局限性,他在时间大于1个小时的时候,会返回错误的时间* 因为该方法调用了Dat ...

  6. java操作Excel有两种方式 方式1:jxl操作Excel jxl的API

    java操作Excel有两种方式 方式1:jxl操作Excel 方式2:poi操作Excel 下面介绍jxl API: 使用Windows操作系统的朋友对Excel(电子表格)一定不会陌生,但是要使用 ...

  7. java 产生随机数的两种方式,Java产生随机数的两种方式

    Java产生随机数的两种方式 Java产生随机数的两种方式 在java中,我们可以通过两种方式来获取随机数(generating a random number)一种是大家熟悉的java.lang.M ...

  8. Java读取证书的两种方式

    关于证书基础以及创建.查看.删除.导入.导出以及其他功能详解请参照:Java使用keytool创建CA证书 Java读取证书有两种方式 1.从文件中读取 public static void main ...

  9. Qt实现多线程编程的两种方式

    Qt实现多线程编程的两种方式 方式一: 继承自QThread类,覆写run函数.此实现方法只有run函数内的代码是运行在子线程内. 代码示例: #ifndef QDEMOTHREAD_H #defin ...

最新文章

  1. 收藏 | 一文打尽AI、机器学习网络资源!
  2. Adnroid体系与系统架构
  3. Java-Web 基础加强之泛型、注解和Servlet3.0新特性
  4. 玩转Eureka+Ribbon系列之Ribbon的负载均衡策略
  5. 代理模式详解(包含原理详解)
  6. 【OpenCV】目标检测
  7. PHP程序员面临的成长瓶颈
  8. 武汉科技大学ACM:1006: 我是老大
  9. 如何使用Python进行时间序列预测的基线预测
  10. 泰拉瑞亚测试速度的软件,泰拉瑞亚1.4工具速度是多少 泰拉瑞亚1.4工具速度介绍-游侠网...
  11. 分享一些C语言的学习资料
  12. MFC笔记2.双击改变listctrl中的值
  13. WEB前端视频教程网站推荐
  14. 【ArcGIS Pro微课1000例】0009:ArcGIS Pro地理配准完整教程(建议收藏)
  15. 同方有云,加速领跑信创新时代
  16. python基础分析_数据分析之Python基础
  17. swift获取openuuid_iOS获取当前设备型号等信息(全)包含iPhone7和iPhone7P
  18. 计算机视觉检测外观,大米外观品质计算机视觉检测的研究
  19. http报文格式简介
  20. cudnn.benchmark = True?是什么意思

热门文章

  1. 线性嵌套实例(三个小实例)
  2. 机器学习之密度聚类算法
  3. 海思嵌入式开发-004-Hi3516烧录问题总结
  4. 欢迎大家关注知识分享公众号
  5. 正则 显示0-100的数字(可以是小数也可以是整数,不能是01,02可以是0.1)
  6. 叭叭一下Servlet的虚拟路径的映射
  7. 基于微信小程序食谱大全系统(微信小程序毕业设计)
  8. 云计算技术及其应用前景分析
  9. 解读CUDA Compiler Driver NVCC - Ch.2 - Compilation Phases
  10. 携程笔试__界面测试用例