线程基础知识 thread

package ctrl;

import sun.rmi.runtime.NewThreadAction;

import java.util.concurrent.*;

/**
 *
 */
public class threadDemo implements Runnable {
    private int i;
    public static void main(String[] args) throws InterruptedException {
        //  Thread thread = new Thread();
        //thread.start();//
        //thread.run();
        //  thread.sleep(111);
        //线程间共享数据
        // thread.wait();
        // thread.notify();
        //插队
        //  thread.join();

        /**
         * 线程安全在三个方面体现:
         * 原子性:提供互斥访问,同一时刻只能有一个线程对数据进行操作,(atomic,synchronized);
         * 可见性:一个线程对主内存的修改可以及时地被其他线程看到,(synchronized,volatile);
         * 有序性:一个线程观察其他线程中的指令执行顺序,由于指令重排序,该观察结果一般杂乱无序,(happens-before原则)。
         */
        //4种常见线程池
        ExecutorService newCachedThreadPool = Executors.newFixedThreadPool(1000);
        /**
         *
         */

        for(int i=0;i<1000;i++){
          threadClassDemo threadClassDemo=  new  threadClassDemo(i);
            /**
             *  线程池中 submit()和 execute()方法有什么区别?
             * 接收的参数不一样
             * submit有返回值,而execute没有
             * submit方便Exception处理
             */
          newCachedThreadPool.execute(threadClassDemo);
        }


//创建一个可缓存的线程池,如果线程池的规模超过了处理需求,将自动回收空闲线程,而当需求增加时,则可以自动添加新线程,线程池的规模不存在任何限制。
  /*        ExecutorService newCachedThreadPool = Executors.newCachedThreadPool();
//这是一个单线程的Executor,它创建单个工作线程来执行任务,如果这个线程异常结束,会创建一个新的来替代它;它的特点是能确保依照任务在队列中的顺序来串行执行。
      ExecutorService newSingleThreadExecutor = Executors.newSingleThreadExecutor();

        ExecutorService newFixedThreadPool =Executors.newFixedThreadPool();
        //创建了一个固定长度的线程池,而且以延迟或定时的方式来执行任务,类似于Timer。
        ExecutorService newScheduledThreadPool =Executors.newScheduledThreadPool();*/

/**
 * synchronized 和 volatile 的区别是什么?

 * volatile本质是在告诉jvm当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取; synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。
 * volatile仅能使用在变量级别;synchronized则可以使用在变量、方法、和类级别的。
 * 两者都能保证变量可见性,volatile不能保证原子性。
 * volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞。
 * volatile标记的变量不会被编译器优化;synchronized标记的变量可以被编译器优化。
 */

    }

    @Override
    public void run() {

    }
}

猜你喜欢

转载自blog.csdn.net/NaYiChuYouShang/article/details/107245753