1.什么是线程
Thread类中有这样的明确定义:线程是程序中执行的线程,Java虚拟机允许程序同时运行多个执行线程。
1.线程有6种状态:新建,运行(可运行),阻塞,等待,计时等待和终止。
新建:当使用new操作符创建新线程时,线程处于“新建“状态
运行(可运行):调用start()方法
阻塞:当线程需要获得对象的内置锁,而该锁正在被其他线程拥有
等待:当线程等待其他线程通知调度表可以运行时
计时等待:对于一些含有时间参数的方法,如Thread类的sleep()
终止:当run()方法运行完毕或出现异常时
2.java创建多线程的方法
class MyThread extends Thread{
public void run(){
System.out.println("Thread开启线程的方式");
}
}
class MyThread1 implements Runnable{
@Override
public void run() {
System.out.println("Runnable开启线程的方式");
}
}
class MyThread2{
public static void test(){
System.out.println("Lambda 表达式在线程中的使用");
}
}
public class ThreadDemo{
public static void main(String[] args) {
MyThread thread = new MyThread();
MyThread1 thread1 = new MyThread1();
// Runnable接口实现线程需要new一个Thread对象
Thread thread2 = new Thread(thread1);
thread.start();
thread2.start();
for (int i = 0; i < 10; i++) {
new Thread(()->{
MyThread2.test();
},"t1").start();
}
}
}
3.线程池的创建方法
创建线程池工具类
@Configuration
public class ThreadPoolConfig {
@Bean(value = "threadPoolInstance")
public ExecutorService createThreadPoolInstance(){
//通过guava类库的ThreadFactoryBuilder来实现线程工厂类并设置线程名称
ThreadFactory threadFactory = new ThreadFactoryBuilder().setNameFormat("thread-pool-%d").build();
/* corePoolSize:核心线程数
maximumPoolSize:最大线程数
keepAliveTime:非核心线程的空闲时间超过keepAliveTime就会被自动终止回收掉
unit:keepAliveTime的时间单位
workQueue:用于保存任务的队列
threadFactory:创建线程的工厂类
handler:线程池无法继续接收任务(队列已满且线程数达到maximunPoolSize)时的饱和策略,取值有AbortPolicy、CallerRunsPolicy、DiscardOldestPolicy、DiscardPolicy*/
ExecutorService threadPool = new ThreadPoolExecutor(10, 16, 60L, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(100), threadFactory, new ThreadPoolExecutor.AbortPolicy());
return threadPool;
}
@Resource(name = "threadPoolInstance")
private ExecutorService executorService;
@Override
public ResultVO addUser(User user){=
executorService.execute(new Runnable() {
@Override
public void run() {
System.out.println("开启多线程");
}
});
return new ResultVO(ResultCode.SUCCESS,"");
}
4. 在 java 中 wait 和 sleep 方法的不同
最大的不同是在等待时wait会释放锁,而sleep一直持有锁。wait通常被用于线程间交互,sleep通常被用于暂停执行。
5. synchronized 和 volatile 关键字的作用
一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,那么就具备了两层语义:
1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是
立即可见的。
2)禁止进行指令重排序。
volatile本质是在告诉jvm当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取;
synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。
1.volatile仅能使用在变量级别;
synchronized则可以使用在变量、方法、和类级别的
2.volatile仅能实现变量的修改可见性,并不能保证原子性;
synchronized则可以保证变量的修改可见性和原子性
3.volatile不会造成线程的阻塞;
synchronized可能会造成线程的阻塞。
4.volatile标记的变量不会被编译器优化;
synchronized标记的变量可以被编译器优化
学习自:https://www.cnblogs.com/neon/p/10918447.html