前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JAVA线程相关

JAVA线程相关

原创
作者头像
羽毛球初学者
发布2024-10-14 21:33:05
850
发布2024-10-14 21:33:05
举报
文章被收录于专栏:JAVA基础知识

线程创建

jdk提供了 3 种方法创建线程:

  • 继承 Thread 类,重写 run 方法。这种方式可以往线程里传参,但是不能再继承其他类。
代码语言:java
复制
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 方法。
代码语言:java
复制
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 方法,这种方式可以获取线程返回结果。
代码语言:java
复制
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 类。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 线程创建
  • 线程状态
  • 多线程框架Executor
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档