java线程(2)

来源:互联网 发布:idm mac版 知乎 编辑:程序博客网 时间:2024/05/29 15:25

静态方法:
Thread.yield()表示线程进行调度,可以进行切换给别的线程(同优先级)

调用notify()和notifyAll()是必须在同步块中,代表其他被wait()的对象可以继续此对象进行的竞争资源,只唤醒等待此锁中的线程
可以用Lock与Condition对象,lock.newCondition();调用condition.signalAll和condition.await()来唤醒和挂起

后台线程:产生的线程仍然是后台线程
setDaemon(true);只有在非后台线程运行时,后台线程才可以运行,不然就死掉,死后finally也不会执行

在一个线程中调用另外一个线程的join() 方法可以保证此线程在另个线程执行完后才执行,可以通过interrupt()方法中断线程,这样也会返回

通过isAlive可以判断是否执行完

boolean是原子性的
volatile修饰的变量为可视的,这样对它的读和写都是同步的

synchronized修饰就是锁,通过Lock l=new ReentrantLock()同样可以产生锁,自己写比较灵活
也可以用synchronized(Object){} 语句块进行同步
ReentrantLock还有tryLock()非阻塞方法尝试获取锁

无限创建线程和并非最优的线程数,最优的应该为Runtime.getRuntime().availableProcessors()
但是如果是IO密集型程序,例如很多连接远程数据库,这样就会多个任务被阻塞,可以适当增加线程数

执行器:

newFixedThreadPool(int)是限制同时执行个数的
newSingleThreadExecutor是数量为1的FixedThreadPool

活动对象:

Callable这个接口是有范性的 可以让线程返回对象
实现call()方法,调用时需要exec.submit(Callable)
返回的是一个Future对象的范性对象,使用get获取时是阻塞的,可以用isDone判断是否准备就绪,通过future返回的,并且是单一的线程机制
1.对象拥有自己的工作器线程。
2.都维护对它自己的域的全部控制权。
3.所有在活动对象的通信都将以这些对象之间的消息队列形式发生
4.所有消息都要排队

 

ThreadLocal可以装对象,并且每个线程访问ThreadLocal得到的不同

Time对象可以指定时间执行
time.scheduletFixedRate(new TimerTask())

同步队列:同步的资源队列,同时只有一个任务对它进行拿和放
LinkedBlockingQueue是无限制的队列
ArrayBlockingQueue是限制大小的队列
SynchronousQueue是大小为1的队列

PipedReader(PipedWriter)这管道也是阻塞的队列。并且可以响应中断。

CountDownLatch:将线程挂上去,
有一个 size设置数字,当数字为0时此队列的任务才会被唤醒,可以通过await()挂起,这是对任务的挂起所以不需要放在同步代码块,可以使用countDown降低数字,可以看成锁

CyclicBarrier对象将线程挂上去,
是有一个size和一个Runnable,每个await()可以降低1,当降低为0的时候会执行Runnable,执行后继续唤醒,可以看成锁

DelayQueue是一个同步的优先级队列,里面必须实现Delay接口(也实现了Comparable接口),使用take取时会取到期的,通过getDelay(TimeUnit unit)设置到期时间,同样是阻塞式的

PriorityBlockingQueue也是一个优先级队列,任务只用实现Comparable接口,这个是阻塞的通过take()取时为空就被阻塞

ScheduledThreadPoolExecutor是按时间执行的通过schedule执行一次,scheduleAtFixedRate()定期执行

Exchanger可以协作2个线程交换对象,通过exchange()进行阻塞式交换,并且离开之后会交换回来

信号量:Semaphore可以用acquire()获取,获取不了就阻塞,使用releaseItem放下信号

在1。5后出现了象CopyOnWriterArraySet和ConcurrentHashMap等,允许并发的读取和写入,不会报又写又访问ConcurrentModificationException。
这样的原理是:在修改时,复制原数组出来,复制出来的一块是不会被访问的,当修改完成时,把这块和原数组替换,这样安全的进行读和写
这样当用跌代器遍历和修改的时候不会报ConcurrentModificationException错

乐观锁:

不使用互斥,我们修改时需要提交新值和旧值,如果旧值不同那么代表已经进行了修改。
使用互斥会导致效率低。
一般用于原子类。

读写锁:

ReadWriteLock可以对读写进行优化,会导致可以多个读,但是有写的时候所有的读都不可用
读和写默认没有优先

 内存栅栏:

指本地或工作内存到主存之间的拷贝动作。
无论读和写都会进行内存栅栏操作。只有当写操作先进行内存栅栏而读操作后进行才能让写操作对其可见。synchronized和volatile标记可以让对象进行全局可见。
 所有操作本先在本地cache或寄存器中完成,之后才会提交到主存再进行内存栅栏。
这意味先进行有效,再进行保存,这个顺序叫happens-before。

 

0 0
原创粉丝点击