线程基础 && 线程池 &&ThreadLocal

JConsole java监控平台
在这里插入图片描述

线程

一、概念

进程:进程指的是运行中的程序,例:IDEA,QQ,微信;系统会给每个进程分配独立的内存空间;进程是程序的执行过程。

线程:每个进程又可以分为多个线程,可以把每个线程看做是一个进程的实体对象;例:下载任务
----单线程:同一个时刻,只允许一个线程
----多线程:同一个时刻,可以执行多个线程

并发:同一时刻,多个任务交替执行,

并行:同一时刻,多个任务同时执行

二、线程的基本使用

1、继承Thread类,重写run方法

Thread类:需创建一个Thread或Thread子类的对象

构造方法                         		 说明
Thread()                   		创建一个线程对象
ThreadString name) 				创建一个具有指定名称的线程对象
ThreadRunable target)				创建一个基于Runnable接口实现类的线程对象
ThreadRunnable 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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值