JConsole java监控平台
线程
一、概念
进程:进程指的是运行中的程序,例:IDEA,QQ,微信;系统会给每个进程分配独立的内存空间;进程是程序的执行过程。
线程:每个进程又可以分为多个线程,可以把每个线程看做是一个进程的实体对象;例:下载任务
----单线程:同一个时刻,只允许一个线程
----多线程:同一个时刻,可以执行多个线程
并发:同一时刻,多个任务交替执行,
并行:同一时刻,多个任务同时执行
二、线程的基本使用
1、继承Thread类,重写run方法
Thread类:需创建一个Thread或Thread子类的对象
构造方法 说明
Thread() 创建一个线程对象
Thread(String name) 创建一个具有指定名称的线程对象
Thread(Runable target) 创建一个基于Runnable接口实现类的线程对象
Thread(Runnable target,String name) 创建一个基于Runnable接口实现类,并且具有指定名称的线程对象
Thread类的常用方法:
方法 说明
public void run() 线程相关的代码写在该方法中,一般需要重写
public void start() 启动线程方法
public static void sleep(long m) 线程休眠m毫秒的方法
public void join() 优先执行调用join()方法的线程
void setDaemon(boolean on) 将此线程标记为守护线程,当运行的线程时守护线程时,JAVA虚拟机将退出
2、实现Runnable,重写run方法
Runnable接口:创建一个实现Runnable接口的类的对象
只有一个方法run();
Runnalble是java中用以实现线程的接口
任何实现线程功能的类都必须实现该接口
public class CPU{
public static void main(String[] args) throws InterruptedException {
System.out.println("I'm:"+Thread.currentThread().getName());
Thread thread = new Thread(new MyThread());
thread.start();
}
}
class MyThread implements Runnable{
@Override
public void run() {
System.out.println("Hello,My Thread:"+Thread.currentThread().getName());
}
}
1、为什么用start启动线程,而不直接执行run方法;
通过start启动,会在start方法内调用一个名为 start0 的 native 方法,该方法有底层的C/C++实现;
如果直接点用类内的run方法,相当于在 main 线程内,对方法进行调用,而没用开启新的线程
分隔一下,我这个idea主题有点太刺眼了,不好区分
2、实现Runnable接口的方式,是怎么实现线程开启的;
因为Runnable接口内是没有start这个方法的,需要Thread 构造器把咱们的参数传进去后在进行start操作
3、常用方法
setName //设置线程名称
getName
start //启动线程,JAVA虚拟机底层调用该线程的 start0 方法
run //调用线程对象run方法
setPriority //设置线程优先级
getPriority
线程优先级:
共10个优先级:(1-10)主线程默认优先级为5
优先级:MAX_PRIORITY:最大优先级10
MIN_PRIORITY: 最小优先级1
NORM_PRIORITY 默认优先级5
sleep //睡觉,让指定线程休眠,参数:毫秒
interrupt //中断线程,但并没有真正的结束线程,一般用于中断正在休眠的线程
-----------------------------------------------------------------
yield:让出CPU使用权,让其他线程优先执行,但时间不确定,所以不一定成功。这是一个 native 方法。
join:调用当前方法的线程获得优先执行的权力,其他线程必须等待该线程执行完才能继续执行。如果任何线程中断了该线程的执行,则抛出InterruptedException(中断异常)
------------------------------------------------------------------
setDaemon: 设置守护线程,当被守护的线程结束以后,该线程也一起结束
------------------------------------------------------------------
Object类提供的方法:
wait()方法:终端方法的执行,使线程等待
notify()方法:唤醒处于等待的某一个线程,使其结束等待
notifyAll()方法:唤醒处于等待线程,使它们结束等待
三、线程状态:
线程状态。 线程可以处于以下状态之一:
NEW
尚未启动的线程处于此状态。
RUNNABLE
在Java虚拟机中执行的线程处于此状态。
BLOCKED
被阻塞等待监视器锁定的线程处于此状态。
WAITING
正在等待另一个线程执行特定动作的线程处于此状态。
TIMED_WAITING
正在等待另一个线程执行动作达到指定等待时间的线程处于此状态。
TERMINATED
已退出的线程处于此状态。
四、线程同步机制
在多线程的编程中,会有多线程访问共享资源,导致预计结果不匹配的情况,例:
public class CPU{
public static void main(String[] args) throws InterruptedException {
MyThread mt = new MyThread();
Thread thread1 = new Thread(mt);
Thread thread2 = new Thread(mt);
Thread thread3 = new Thread(mt);
thread1.start();
thread2.start();
thread3.start();
}
}
class MyThread implements Runnable{
static int i = 100;
@Override
public void run() {
while (true){
if (i<=0){
break;
}
try {
Thread.sleep(50