java 多线程的一些基础

来源:互联网 发布:数据新闻手册 编辑:程序博客网 时间:2024/06/07 05:29

线程:进程中负责程序执行的执行单元

线程本身依靠程序进行运行

线程是程序中的顺序控制流,只能使用分配给程序的资源和环境

进程:执行中的程序

一个进程至少包含一个线程

单线程:程序中只存在一个线程,实际上主方法就是一个主线程

多线程:在一个程序中运行多个任务

目的是更好地使用CPU资源

一些常用方法和注意点:

调用start()方法后并不是立即的执行多线程的代码,而是使该线程变为可

运行态,什么时候运行多线程代码是由操作系统觉定的。

调用interrupt方法,线程的中断状态将被置位。

while(!Thread.currentThread().isInterrupted()){

do something

}

但是如果此时线程处于阻塞状态(sleep或者wait),就无法检查中断状态,此时会抛出InterruptedException异常。

void interrupt():向线程发送中断请求,线程的中断状态将会被设置为true,如果当前线程被一个sleep调用阻塞,那么将会抛出interrupedException异常。

static boolean interrupted():测试当前线程(当前正在执行命令的这个线程)是否被中断。注意这是个静态方法,调用这个方法会产生一个副作用那就是它会将当前线程的中断状态重置为false。

boolean isInterrupted():判断线程是否被中断,这个方法的调用不会产生副作用即不改变线程的当前中断状态。

static Thread currentThread() : 返回代表当前执行线程的Thread对象。

首先我们可以通过t.setDaemon(true)的方法将线程转化为守护线程。而守护线程的唯一作用就是为其他线程提供服务。计时线程就是一个典型的例子,它定时地发送“计时器滴答”信号告诉其他线程去执行某项任务。当只剩下守护线程时,虚拟机就退出了,因为如果只剩下守护线程,程序就没有必要执行了。另外JVM的垃圾回收、内存管理等线程都是守护线程。还有就是在做数据库应用时候,使用的数据库连接池,连接池本身也包含着很多后台线程,监控连接个数、超时时间、状态等等。最后还有一点需要特别注意的是在java虚拟机退出时Daemon线程中的finally代码块并不一定会执行

因此在构建Daemon线程时,不能依靠finally代码块中的内容来确保执行关闭或清理资源的逻辑。

(1). 新建状态(New):新创建了一个线程对象。

(2). 就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。

(3). 运行状态(Running):就绪状态的线程获取了CPU,执行程序代码。

(4). 阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种:

等待阻塞(WAITING):运行的线程执行wait()方法,JVM会把该线程放入等待池中。

- 同步阻塞(Blocked):运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中。

- 超时阻塞(TIME_WAITING):运行的线程执行sleep(long)或join(long)方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。

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

java 多线程的一些基础

原创粉丝点击