admin管理员组文章数量:1794759
JAVA线程相关
线程创建
jdk提供了 3 种方法创建线程:
- 继承 Thread 类,重写 run 方法。这种方式可以往线程里传参,但是不能再继承其他类。
public class ThreadRuning extends Thread{
public ThreadRuning(String name){
//重写构造,可以对线程添加名字
super(name);
}
@Override
public void run() {
while(true){
System.out.println("good time");
//在run方法里,this代表当前线程
System.out.println(this);
}
}
public static void main(String[] args){
ThreadRuning threadRuning = new ThreadRuning("1111");
threadRuning.start();
}
}
- 实现 Runable 接口,实现 run 方法。
public class RunableTest implements Runnable {
@Override
public void run() {
while (true) {
System.out.println("good time");
}
}
public static void main(String[] args) {
RunableTest runableTest1 = new RunableTest();
RunableTest runableTest2 = new RunableTest();
new Thread(runableTest1).start();
new Thread(runableTest1).start();
new Thread(runableTest2).start();
}
}
- 实现 Callable 接口,实现 call 方法,这种方式可以获取线程返回结果。
public class CallTest implements Callable {
@Override
public Object call() throws Exception {
return "hello world";
}
public static void main(String[] args){
FutureTask<String> futureTask = new FutureTask<String>(new CallTest());
new Thread(futureTask).start();
try {
String result = futureTask.get();
System.out.println(result);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
线程状态
线程状态可分为以下几种:
- NEW:线程刚创建, 尚未启动
- RUNNABLE:线程正在正常运行中或者处于可运行状态,当然可能会有某种耗时计算、IO 等待的操作、CPU 时间片切换等, 这个状态下发生的等待一般是其他系统资源, 而不是锁和 Sleep 等。
- BOLCKED:阻塞状态,这个状态下, 是在多个线程有同步操作的场景, 比如正在等待另一个线程的 synchronized 块的执行释放, 或者可重入的 synchronized 块里别人调用 wait() 方法, 也就是说这里是线程在等待进入临界区。
- WAITING:等待被唤醒状态,指线程拥有了某个锁之后, 调用了它的 wait 方法, 等待锁拥有者调用 notify / notifyAll 以便该线程可以继续下一步操作。这里要区分 BLOCKED 和 WATING 的区别,BLOCKED是在临界点外面等待进入,WAITING是在临界点里面 wait 等待别人 notify,线程调用了 join 方法 join 了另外的线程的时候,也会进入 WAITING 状态,等待被它 join 的线程执行结束。
- TIMED_WAITING:有时间限制的 WAITING,会释放 CPU 时间片,但是不会释放锁。一般出现在调用 wait(long)、join(long)等情况下,此外当线程调用sleep方法后, 也会进入 TIMED_WAITING 状态。
- TERMINATED:终止状态
各个状态的流转关系如下图所示:
多线程框架Executor
Executor框架提供创建线程池的方法ThreadPoolExecutor,该方法有以下这些重要参数:
- corePoolSize: 线程池核心线程数
- maximumPoolSize:线程池最大数
- keepAliveTime: 空闲线程存活时间
- unit: 时间单位
- workQueue: 线程池所使用的缓冲队列
- threadFactory:线程池创建线程使用的工厂
- handler: 线程池对拒绝任务的处理策略
当往线程池中提交任务时,如果运行线程数小于corePoolSize,那么马上创建线程运行这个任务;如果正在运行的线程数大于等于corePoolSize,那么将这个任务放进队列;;如果队列放满了,且正在运行的线程数小于maximumPoolSize,那么就创建线程处理任务;如果队列放满了,正在运行的线程数大于等于maximumPoolSize,那么会抛出异常 RejectExecutionException,执行拒绝策略。
同时Executor框架还提供了四个简单的构造方法:
- public static ExecutorService newFixedThreadPool(int nThreads) :创建固定数目线程的线程池。
- public static ExecutorService newCachedThreadPool() :创建一个可缓存的线程池,调用 execute 将重用以前构造的线程(如果线程可用)。如果现有线程没有可用的,则创建一个新线程并添加到池中。当线程超过 60s 未被使用,那么会被终止并从缓存中移除。
- public static ExecutorService newSingleThreadExecutor() :创建一个单线程化的Executor。
- public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) :创建一个支持定时及周期性的任务执行的线程池,多数情况下可用来替代 Timer 类。
本文标签: JAVA线程相关
版权声明:本文标题:JAVA线程相关 内容由林淑君副主任自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.xiehuijuan.com/baike/1754858345a1707412.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论