• java线程操作


    前言

    进程:内存运行的程序。

    线程:进程中的一个执行单元。

    创建多线程的方式

    本质都是调用自己写的run方法。

    1继承thread抽象类

    Thread thread = new Thread(){
        @Override
        public void run() {
            for(int i=0;i<10;i++){
                System.out.println("线程创建的第一种方式:"+Thread.currentThread().getName());
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    };
    thread.start();
    

    2实现Runnable接口

    Thread thread2 = new Thread(new Runnable() {
        @Override
        public void run() {
            for(int i=0;i<10;i++){
                System.out.println("线程创建的第二种方式:"+Thread.currentThread().getName());
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    });
    thread2.start();
    

    3实现Callable接口

    FuttureTask继承RunnableFuture,
    RunnableFuture继承runnable和future。

    FutureTask<Integer> ft = new FutureTask<Integer>(new Callable<Integer>() {
        @Override
        public Integer call() throws Exception {
            int i = 0;
            for(;i<10;i++){
                System.out.println("线程创建的第三种方式:"+Thread.currentThread().getName());
            }
            return i;
        }
    });
    new Thread(ft).start();
    

    匿名内部类

    改进实现runnable接口的形式

    jdk8 lambda简写:

    new Thread(()->{
                System.out.println(123);
            }).start();
    

    完整版

    new Thread(new Runnable() {
                @Override
                public void run() {
                    for (int i = 0; i < 10000; i++) {
                        System.out.println(Thread.currentThread().getName() + i);
                    }
                }
            }).start();
    

    线程池

    • Executors创建线程池

    阿里巴巴不推荐

    ExecutorService service = Executors.newFixedThreadPool(2);
    service.submit(new Runnable() {
        @Override
        public void run() {
            System.out.println("新线程执行");
        }
    });
    
    有什么线程池?
    new SingleThreadExecutor:创建一个单线程的线程池
    new FixedThreadPool:创建固定大小的线程池
    new CachedThreadPool:创建一个可缓存的线程池,最大空闲时间默认为1分钟,超过就会被删除。
    new ScheduledThreadPool:创建一个大小无限的线程池,可以延迟、定时循环执行任务。
    
    • 线程池启动策略
    ThreadPoolExecutor executor = new ThreadPoolExecutor(10,
            20,
            60L,
            TimeUnit.SECONDS,
            new SynchronousQueue<Runnable>(),
            Executors.defaultThreadFactory(),
            new ThreadPoolExecutor.AbortPolicy()
    );
    
    线程池创建
    
    添加任务时:
    如果当前线程数量小于corePoolSize,则马上创建线程运行任务。
    
    如果大于等于core Pool Size,任务放入队列。
    
    如果队列满了,线程总数小于最大值,创建线程运行任务。
    
    如何,线程总数等于,则报错。
    

    线程安全

    多个线程同时对一个数据进行写操作,会出现安全问题。

    同步代码块

    所有线程都要使用同一把锁,比如: ""

    synchronized(同步锁){
        # 需要同步操作的代码
    }
    # 强制处于waiting状态
    同步锁.waiting();
    
    # 唤醒处于waiting状态的线程来抢锁:
    同步锁.notify();
    

    同步方法

    对于非static方法,同步锁就是this。
    对于static方法,我们使用当前方法所在类的字节码对象(类名.class)

    public synchronized void method(){
    可能会产生线程安全问题的代码
    }
    

    锁机制

    同理:一定要使用同一把锁!!!

    Lock lock = new ReentrantLock();
    ExecutorService service = Executors.newFixedThreadPool(2);
    service.submit(new Runnable() {
        @Override
        public void run() {
            lock.lock();
            System.out.println(123);
            lock.unlock();
        }
    });
    

    线程状态

  • 相关阅读:
    java实现还款计算
    java实现风险度量
    java实现字符串比较
    java实现风险度量
    java实现风险度量
    java实现还款计算
    java实现还款计算
    java实现字符串比较
    java实现字符串比较
    java实现风险度量
  • 原文地址:https://www.cnblogs.com/birdofparadise/p/9769286.html
Copyright © 2020-2023  润新知