并发编程实现的基本方式、线程池创建及执行任务、线程优先级、后台线程

1,Thread.yield()方法可以提醒线程调度器去执行别的线程;

2,ExecutorService exec = Executors.newCachedThreadPool();

exec.execute(实现runable接口的类);

exec.shutdown();代表当前线程池在shutdown方法调用后将拒绝添加新的任务,但之前添加的任务仍然照常执行。

2,ExecutorService exec = Executors.newFixedThreadPool(5);

创建一个有边界的线程池,省去了上面线程池创建线程的时间,这个线程池会初始化时就创建所有线程。

3,ExecutorService exec = Executors.newSingleThreadExecutor();

创建一个单线程的线程池,本质即一个线程的FixedThreadPool,加入到该线程池中的任务会排队执行。

4,class TaskWithResult implements Callable{}

List<Future<String>> results = new ArrayList();

results.add(exec.submit(new TaskWithResult()));

ExecutorService执行submit方法返回Future,Future可以执行isDone方法判断该线程是否结束,调用get方法会阻塞,一直等到该线程返回值。

5,TimeUnit.MILLISECONDS.sleep(100);这个方法代替之前Thread.sleep();

6,通过修改线程优先级:Thread.currentThread().setPriority()可以设置优先级,优先级高的理论上会被多执行。

7,后台线程的概念:线程默认是非后台的,因为后台线程并不能阻止程序退出,即在main方法中开启多个后台线程,main方法结束后,多个后台线程不管是否执行完,都结束。后台线程可以通过setDaemon(true)设置。

8,synchronized:非静态方法是锁当前对象,静态方法是锁类,给代码块加锁:锁定某个对象。

Lock lock = new ReenTrantLock();lock.lock;在finally中添加代码lock.unlock();

9,volatile保证变量可见性,有序性。但并不能保证线程安全。可能存在还剩4张票,多个线程执行i—后可能,还剩3张票。

10,原子类:这种类保证了,不用加锁,就可以保证线程安全。

11,synchronized关键字加到非静态方法上,一个对象被多个线程调用,这个对象的多个加锁的方法是互斥的。

多个对象被多个线程调用,加锁的方法是互不影响的。

synchronized关键字加到静态方法上,多个线程中用类调用加锁静态方法,互斥的。

这个类的某个对象在多个线程中,调用加锁的静态或非静态方法,互斥的。

多个线程中使用一个对象,有的调用加锁静态方法、有的调用加锁非静态方法,不会互斥。

 

猜你喜欢

转载自blog.csdn.net/u013577996/article/details/82620393