一点一点学线程(一)线程基础

一点一点学线程(一)线程基础

1、线程概念
线程:序中的执行线程。Java 虚拟机允许应用程序并发地运行多个执行线程。
线程的构成:
1)线程ID。用于标实线程
2)当前指令指针PC。标明下一指令执行点
3)寄存器集合和堆栈。该线程的可用空间
线程访问权限
 一般来说线程能访问进程内存中的所有数据,但实际应用中线程也有自己的空间
1)栈(可能被其他进程访问,但仍可认为是私有数据)
2)线程局部存储,一般只有很小容量
3)寄存器(包括PC寄存器)
多线程:指的是这个程序(一个进程)运行时产生了不止一个线程
并行与并发:
并行:多个cpu实例或者多台机器同时执行一段处理逻辑,是真正的同时。
并发:通过cpu调度算法,让用户看上去同时执行,实际上从cpu操作层面不是真正的同时。并发往往在场景中有公用的资源,那么针对这个公用的资源往往产生瓶颈,我们会用TPS或者QPS来反应这个系统的处理能力。
总结下程序和进程的区别:
1)进程是动态的,而程序是静态的
2)进程有一个生命周期,而程序是指令集合,本身无“运动”含义。没有建立进程的程序不能作为一个单独的单位得到操作系认可
3)1个程序可产生多个进程,一个进程只对应一个程序

2、线程的属性

2.1创建线程

(一)继承Thread

1 class MyThread extends Thread {
 3     private int i = 0;
 5     @Override
 6     public void run() {
 7         for (i = 0; i < 100; i++) {
 8             System.out.println(Thread.currentThread().getName() + " " + i);
 9         }
10     }
11 }

启动线程:

  Thread myThread1 = new MyThread(); 

    myThread1.start();

(二)实现接口Runnable

1 class MyRunnable implements Runnable {
 2     private int i = 0;
 4     @Override
 5     public void run() {
 6         for (i = 0; i < 100; i++) {
 7             System.out.println(Thread.currentThread().getName() + " " + i);
 8         }
 9     }
10 }

启动线程:

  Runnable myRunnable = new MyRunnable(); // 创建一个Runnable实现类的对象
 Thread thread1 = new Thread(myRunnable); // 将myRunnable作为Thread target创建新的线程
  thread1.start();

2.2线程的属性

currentThread()    返回对当前正在执行的线程对象的引用

yield()    暂停当前正在执行的线程对象,并执行其他线程。

sleep(long millis)    在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。该线程不丢失任何监视器的所属权。

sleep(long millis,int nanos)    在指定的毫秒数加指定的纳秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。该线程不丢失任何监视器的所属权。

start()    使该线程开始执行;Java 虚拟机调用该线程的 run 方法。

run()   如果该线程是使用独立的Runnable 运行对象构造的,则调用该Runnable 对象的run 方法;否则,该方法不执行任何操作并返回。

interrupt()    中断线程。

interrupted()    测试当前线程是否已经中断。

isInterrupted()    测试线程是否已经中断。

isAlive()     测试线程是否处于活动状态。如果线程已经启动且尚未终止,则为活动状态。

setPriority(int newPriority)    更改线程的优先级。

getPriority()    返回线程的优先级。

setName(String name)   改变线程名称,使之与参数name 相同。

getName()    返回该线程的名称。

getThreadGroup()    返回该线程所属的线程组。 如果该线程已经终止(停止运行),该方法则返回 null。

activeCount()     返回当前线程的线程组中活动线程的数目。

join(long millis)    等待该线程终止的时间最长为 millis 毫秒。超时为0 意味着要一直等下去。

join()   等待该线程终止

setDaemon(boolean on)    将该线程标记为守护线程或用户线程。当正在运行的线程都是守护线程时,Java 虚拟机退出。

isDaemon()    测试该线程是否为守护线程。

toString()    返回该线程的字符串表示形式,包括线程名称、优先级和线程组。

2.3线程的状态

Java线程具有五中基本状态

新建状态(New):当线程对象对创建后,即进入了新建状态,如:Threadt = new MyThread();

就绪状态(Runnable):当调用线程对象的start()方法(t.start();),线程即进入就绪状态。处于就绪状态的线程,只是说明此线程已经做好了准备,随时等待CPU调度执行,并不是说执行了t.start()此线程立即就会执行;

运行状态(Running):当CPU开始调度处于就绪状态的线程时,此时线程才得以真正执行,即进入到运行状态。注:就    绪状态是进入到运行状态的唯一入口,也就是说,线程要想进入运行状态执行,首先必须处于就绪状态中;

阻塞状态(Blocked):处于运行状态中的线程由于某种原因,暂时放弃对CPU的使用权,停止执行,此时进入阻塞状态,直到其进入到就绪状态,才 有机会再次被CPU调用以进入到运行状态。根据阻塞产生的原因不同,阻塞状态又可以分为三种:

1.等待阻塞:运行状态中的线程执行wait()方法,使本线程进入到等待阻塞状态;

2.同步阻塞 -- 线程在获取synchronized同步锁失败(因为锁被其它线程所占用),它会进入同步阻塞状态;

3.其他阻塞 -- 通过调用线程的sleep()或join()或发出了I/O请求时,线程会进入到阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。

死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值