Java多线程编程

终于开始动手整理自己的多线程学习之路了,orz,fighting!为了提高系统性能而奋斗!!

先附上大牛博客链接镇楼:http://lavasoft.blog.51cto.com/62575/99153

基本上算是对大牛博客的学习笔记,然后外加自己总结的一点东东。。。。

Item 1:可以使线程离开运行状态的几种方法

1.线程睡眠是保证所有线程获得运行机会的最好方法,sleep()方法是静态方法,只对当前正在运行的线程起作用。

2.Thread.yield()方法可以暂态当前线程使其回到可运行状态,以允许就有相同优先级的其他线程得以执行,不过此方法是尽力而为属性,因为该让步线程很可能又会被调度程序再次选中哦

3.join()方法可停止当前执行的线程直到加入线程执行完毕为止,不过如果加入线程没有存活,那么当前线程没有必要停止。

4.在对象上调用wait()方法(改天实验一下)

5.线程run完了当然就离开的说

6.大boss级别的线程调度程序,爷让你死,你不得不死

Item 2:尽量通过实现Runnable接口而不是继承Thread类来实现多线程

Runnable接口有助于实现资源共享哦,当然将Thread继承类中相应的部分声明为static也可以达到此目的,但是Runnable方式貌似更有助于数据和代码的封装呢

Item3:synchronized关键字和锁

同步会破坏并发性,应该尽量减少同步的范围,对于同步,具体的java代码里需要完成两步:把竞争访问的资源标识为private;同步哪些修改变量的代码,使用synchronized关键字同步方法或代码。synchronized只能标记非抽象方法,不能标识成员变量。

在使用synchronized关键字时候,应该尽可能避免在synchronized方法或synchronized块中使用sleep或者yield方法,因为synchronized程序块占有着对象锁,你休息那么其他的线程只能一边等着你醒来执行完了才能执行。不但严重影响效率,也不合逻辑。

同样,在同步程序块内调用yeild方法让出CPU资源也没有意义,因为你占用着锁,其他互斥线程还是无法访问同步程序块。当然与同步程序块无关的线程可以获得更多的执行时间。

Item4:Volatile关键字

大牛连接:http://sakyone.iteye.com/blog/668091

Volatile关键字是对单个变量的同步,synchronized是对其代码块内的所有变量值的同步,所以效率方面Volatile会更高一些,不过Volatile只能保证简单类型变量在其值与自身上一个值无关的时候才是原子操作,比如n=n+1不是,而n=m+1是。如果没有Volatile关键字修饰,那么每一个线程都会为此变量维护一个副本,存放在其内存(如寄存器)内,线程对变量的修改其实就是对副本的修改,如果有Volatile的话,就是对主存内变量本身的修改了。注意,Volatile不能修饰final变量,因为final变量不能修改,所以就不存在线程安全的问题了。

Item5:线程池

相关类:java.util.concurrent.Executors

相关链接:http://www.cnblogs.com/jersey/archive/2011/03/30/2000231.html

Java里面线程池的顶级接口是Executor,但是严格意义上讲Executor并不是一个线程池,而只是一个执行线程的工具。真正的线程池接口是ExecutorService。

几种不同的线程池:1.固定大小线程池:ExecutorService pool = Executors.newFixedThreadPool(2);2.单任务线程池:ExecutorService pool = Executors.newSingleThreadExecutor();3.可变尺寸线程池:ExecutorService pool = Executors.newCachedThreadPool(); 4.延迟线程池:   ScheduledExecutorService pool = Executors.newScheduledThreadPool(2); (创建一个线程池,它可安排在给定延迟后运行命令或者定期地执行。)5.单任务延迟连接池:ScheduledExecutorService pool = Executors.newSingleThreadScheduledExecutor();6.自定义线程池:  BlockingQueue<Runnable> bqueue = new ArrayBlockingQueue<Runnable>(20); (创建等待队列) ThreadPoolExecutor pool = new ThreadPoolExecutor(2,3,2,TimeUnit.MILLISECONDS,bqueue);(创建一个单线程执行程序,它可安排在给定延迟后运行命令或者定期地执行。

Item6:有返回值的线程

可返回值的任务必须实现Callable接口,类似的,无返回值的任务必须Runnable接口

执行Callable任务后,可以获取一个Future的对象,在该对象上调用get就可以获取到Callable任务返回的Object了。

Item7:锁

在实际开发中,最好在能用读写锁的情况下使用读写锁,而不要用普通锁,以求更好的性能。

Item8:信号量

信号量常常用于多线程的代码中,并能监控有多少数目的线程等待获取资源,并且通过信号量可以得知可用资源的数目等等。

从结果可以看出,信号量仅仅是对池资源进行监控,但不保证线程的安全,因此,在使用时候,应该自己控制线程的安全访问池资源。

Item8:start() vs run()

thread.start()是真正的实现了多线程,通过该方法启动了一个线程,而run()方法只是普通方法,直接调用该方法,程序还是在主线程中运行,所以程序顺序执行,和用不用线程没啥区别,调用start()方法后,线程处于就绪状态,随后可以自动调用run()方法,由于多线程,所以程序执行顺序可能和代码中的顺序不同。。。

http://blog.csdn.net/ujswml/article/details/5826570




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值