Java 学习(27)---(多线程 / Runnable 接口 / 调度和优先级)
多线程
1 .概念
多线程:一个应用程序有多条执行路径进程:正在执行的应用程序
线程:进程的执行单元,执行路径
单线程:一个应用程序只有一条执行路径
多线程:一个应用程序有多条执行路径
多进程的意义 ---提高 CPU 的使用率
多线程的意义 ---提高应用程序的使用率
提示 :Java程序的运行原理及 JVM 的启动是多线程的吗 ?
A:Java命令去启动 JVM, JVM 会启动一个进程,该进程会启动一个主线程。
B:JVM 的启动是多线程的, 因为它最低有两个线程启动了, 主线程和垃圾回收线程。
2 .多线程的实现方案
1.继承 Thread 类,2.重写 run 方法;
API:
public final String getName(): 获取线程的名称
public final void setName(String name) :设置线程的名称
public static Thread currentThread(): 返回正在执行的线程对象
public final int getPriority() :返回线程对象的优先级
public final void setPriority(int newPriority) :更改线程的优先级
public final void join() :等待该线程执行完毕。
public static void sleep(long millis) :线程休眠
public static void yield(): 暂停当前正在执行的线程对象,并执行其他线程
(让多个线程的执行更和谐,但是不能靠它保证一人一次。)
public final void setDaemon(boolean on): 将该线程标记为守护线程或用户线程。
当正在运行的线程都是守护线程时, Java 虚拟机退出。该方法必须在启动线程前调用。
public final void stop() :让线程停止,过时了,但是还可以使用。
public void interrupt(): 中断线程,把线程的状态终止,并抛出一个 InterruptedException
publicclass MyThread extends Thread { @Override publicvoid run() { System.out.println(" 好好学习,天天向上 "); // 一般来说,被线程执行的代码肯定是比较耗时的。所以我们用循环改进 for ( int x = 0; x < 200; x++) { System. out .println(x); } } }
创建线程对象--- MyThread my = new MyThread();
启 动 线 程---my.run();
调用 run() 方法为什么是单线程的呢 ?
因为 run() 方法直接调用其实就相当于普通的方法调用 , 所以你看到的是单线程的效果,
要想看到多线程的效果,就必须说说另一个方法: start()
面试题: run() 和start() 的区别 ?
run(): 仅仅是封装被线程执行的代码,直接调用是普通方法
start(): 首先启动了线程,然后再由 jvm 去调用该线程的 run() 方法。
/MyThread my = new MyThread();
my.start();
IllegalThreadStateException: 非法的线程状态异常 为什么呢 ?
因为这个相当于是 my线程被调用了两次。而不是两个线程启动 my.start();
创建两个线程对象
MyThread my1 = new MyThread(); MyThread my2 = new MyThread(); my1.start(); my2.start();
3.实现 Runnable 接口,实现 run 方法
publicclass MyRunnable implements Runnable { @Override publicvoid run() { for ( int x = 0; x < 100; x++) { // 由于实现接口的方式就不能直接使用Thread 类的方法了 , 但是可以间接的使用 System. out .println(Thread.currentThread().getName()+ ":" +x); } } } // 创建 MyRunnable 类的对象 MyRunnable my = new MyRunnable(); // 创建 Thread 类的对象,并把C步骤的对象作为构造参数传递 Thread(Runnable target) Thread t1 = new Thread(my); Thread t2 = new Thread(my); t1.setName("三体"); t2.setName("大刘"); Thread(Runnable target, String name); Thread t1 = new Thread(my,"三体"); Thread t2 = new Thread(my, "刘意"); t1.start(); t2.start();
4.线程的调度和优先级问题
线程的调度
a:分时调度:所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间片。
b:抢占式调度 (Java采用的是该调度方式 )
优先让优先级高的线程使用 CPU,如果线程的优先级相同, 那么会随机选择一个,优先级高的线程获取的 CPU 时间片相对多一些。
获取和设置线程优先级
线程优先级高仅仅表示线程获取的 CPU 时间片的几率高,但是要在次数比较多,或者多次运行的时候才能看到比较好的效果。
默认是 5 / 范围是 1-10

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Python-递归、三元表达式列表生成式等
一、函数递归 1.什么是函数递归:函数的递归调用是函数嵌套的一种特殊形式,在调用一个函数的过程中又直接或者间接地调用该函数本身,称之为函数的递归调用 2.递归调用必须明确的两个阶段: 1.回溯:一次次递归调用下去,应该让每一次重复问题的规模有所减少,直到逼近最终的结果,即回溯阶段一定要有明确的结束条件 2.递推:往回一层一层推算结果 例子: # def age(n): # if n == 1: # return 18 # return age(n-1) + 2 # # # print(age(5)) 思路: # age(5)=age(4)+2 # age(4)=age(3)+2 # age(3)=age(2)+2 # age(2)=age(1)+2 # age(1)=18 # # age(n)=age(n-1)+2 #n>1 # age(n)=18 #n=1 二分法: # nums=[13,15,17,23,31,53,74,81,93,102,103,201,303,403,503,777] # find_num=503 # # # def binary_search(nums...
- 下一篇
基于Win10极简SonarQube C#代码质量分析
博客有些好些时间未更新了,这几个月的时间里,离开了实习的公司、大学毕了业、来了新公司、转了户口,有点忙,最近总算稍微闲下来了,打算重新拾起博客,坚持写下去。 言归正转,什么是SonarQube ? SonarQube(曾用名Sonar(声纳))是一个优秀的开源代码分析系统管理系统,支持超过25+种编程语言,对.Net Core当然也是支持的。 最近公司做的项目是用的Framework开发的,久仰SonarQube大名,今天在本地搭建SonarQube之后对项目进行分析,效果惊人。揪出了系统中潜藏的若干Bug,功不可没,所以在这里搭建的方法分享给大家,希望对大家有所帮助。 在网上找一些资料,关于Sonar的介绍在Linux平台下较多,所以我下面的介绍主要是基于Win平台的,其他平台大同小异。 安装Sonar主要有以下几步: 安装JAVA SDK Sonar是一款基于JAVA开发的工具,安装JAVA SDK的过程在此不再叙述,建议安装好之后配置好JAVA_HOME的环境变量,以下是下载地址。 http://www.oracle.com/technetwork/java/javase/dow...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2全家桶,快速入门学习开发网站教程
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装