java多线程学习

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值