关于线程的一些基础问题

常用API

        public final String getName():获取线程的名字
		public final void setName(String name):设置线程的名字
		public static Thread currentThread():获取当前正在执行的线程对象
		public final int getPriority():获取线程的优先级
			默认等级为5
			范围:1-10
		public final void setPriority(int newPriority):设置优先级
		public final void setDaemon(boolean on):设置守护线程
		public static void sleep(long millis):睡觉,形参是毫秒值

1.线程生命周期

新建,就绪,运行,阻塞,终止

 简单版:

复杂版:

2.wait() 和 sleep() 方法的区别?

从三个角度来说,

1.对于同步锁:在同步锁代码块中,wait()会释放同步锁,让其他线程进入synchronized,sleep()则不然,并不会释放锁

2.使用范围不同:sleep是Thread中的方法,wait是Object里的方法,sleep()可以在任何地方使用,但是wait()只能在同步控制方法或者同步控制块中使用,否则会抛出IllegalMonitorStateException

3.恢复方式不同:sleep()时间到了自动恢复,wait()需要其他线程调用同一对象的notify()和notifyAll()

具体代码参考:sleep() 和 wait() 的区别_yinhuanxu-CSDN博客_sleep和wait

3.线程的 join() 方法是干啥用的?

如果一个线程A执行了另外个线程的例如:threadB.join() 含义是线程A立刻进入阻塞,线程B开始执行,执行完毕后线程A再继续执行

参考以下代码:

public class TestJoin {

    public static void main(String[] args) throws Exception {

        //1
        System.out.println("进入线程:" + Thread.currentThread().getName());

        Service service = new Service();
        MyThread myThread = new MyThread(service);
        myThread.setName("myThread线程");
        //3
        myThread.start();
        //2
        System.out.println("线程:" + Thread.currentThread().getName() + "等待");
        //主线程开始等待
        myThread.join();
        //6
        System.out.println("线程" + Thread.currentThread().getName() + "继续执行");
    }

}

class MyThread extends Thread{

    public MyThread(Service service) {
    }

    @Override
    public void run() {
        //4
        System.out.println("进入线程" + Thread.currentThread().getName());
        try {
            Thread.currentThread().sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        //5
        System.out.println("线程" + Thread.currentThread().getName() + "执行完毕");
    }
}

结果为:

查阅 join() 源码发现 join中用了 wait() 方法,

由于 wait() 方法会让线程进入阻塞状态,并且会释放线程占有锁,并交出CPU执行权限

所以 join() 方法也同样会让线程释放该运行线程锁

4.Thread 调用 start() 方法和调用 run() 方法的区别 ?

start():会new一个新线程

run():重写Thread里面的方法,并不会新开一个线程

例如:

1.结果为线程A,线程A,线程A,线程A,线程B,线程B,线程B,线程B

2.结果为线程A,线程B,线程A,线程B,线程A,线程B,线程B,线程A

的区别

5.编写多线程的几种实现方式

(1)继承Thread类

(2)实现Runnable接口

(3)实现Callable接口

其中 Thread其实也是实现了Runable接口 

Runnable和Callable的主要区别在于是否有返回值

6.为什么要使用线程池?直接new个线程不是很舒服?

如果频繁new线程,不仅会消耗系统资源,还会降低系统的稳定性

线程池好处:

1.降低资源消耗 通过重复利用已创建的线程 降低线程创建和销毁造成的消耗

2.提高相应速度 进程到位时 可以直接从线程池中拿取线程执行任务

3.增加线程的可管理型 线程是稀缺资源 使用线程池可以进行统一分配 调优和监控

7.线程池的核心属性

1.threadFactory(线程工厂): 用于创建工作线程的工厂

2.corePoolSize(核心线程数):当线程池运行的线程少于corePoolSize,将创建一个新线程来处理请求,即使其他工作线程未被使用

3.workQueue(队列): 用于保留任务并移交给工作线程的阻塞队列

4.maximumPoolSize(最大线程数)

5.handler(拒绝策略):当任务量超过线程池可以保存的最大任务数时,执行的策略

6.keepAliveTime(保持存活时间):空闲线程存活时间

7.TimeUnit:时间单位

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值