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() {
}
}