基础:http://www.cnblogs.com/rollenholt/archive/2011/08/28/2156357.html
线程章节:http://lavasoft.blog.51cto.com/62575/27069
链接:
http://wangqiang6028.iteye.com/blog/1887342
http://blog.csdn.net/zuoluoboy/article/details/4034935#t3
http://www.blogjava.net/vincent/archive/2008/08/23/223912.html
---java多线程
在java中要想实现多线程,有两种方式,一种是继续Thread类,另外一种是实现Runable接口。
--线程安全(针对变量来说)
链接:http://blog.csdn.net/gideal_wang/article/details/3649621
线程安全是针对多线程来讲的,如果所使用的公用变量在多线程下没有被保护机制时,变量结果会和理论值不一致,这样就叫作线程不安全。
相反公用变量在保护机制下工作,就不会出现“随机”变化,这时叫线程安全。
线程安全: 在多线程中使用时,不用自已做同步处理.
线程不安全: 在多线程中使用时,必须做线程同步,不然会有未知后果.
在java中,每次程序运行至少启动2个线程。一个是main线程,一个是垃圾收集线程
--sleep方法与wait方法的区别:
sleep方法是静态方法,wait方法是非静态方法。
sleep方法在时间到后会自己“醒来”,但wait不能,必须由其它线程通过notify(All)方法让它“醒来”。
sleep方法通常用在不需要等待资源情况下的阻塞,像等待线程、数据库连接的情况一般用wait。
--sleep/wait与yeld方法的区别:
调用sleep或wait方法后,线程即进入block状态,而调用yeld方法后,线程进入runnable状态。
--wait与join方法的区别:
wait方法体现了线程之间的互斥关系,而join方法体现了线程之间的同步关系。
wait方法必须由其它线程来解锁,而join方法不需要,只要被等待线程执行完毕,当前线程自动变为就绪。
join方法的一个用途就是让子线程在完成业务逻辑执行之前,主线程一直等待直到所有子线程执行完毕。
--[notify/notifyAll方法]
--线程的同步是保证多线程安全访问竞争资源的一种手段,对于同步,在具体的Java代码中需要完成一下两个操作:
把竞争访问的资源标识为private;
同步哪些修改变量的代码,使用synchronized关键字同步方法或代码。
把一个单元声明为synchornized,就可以让在同一时间只有一个线程操作该方法.
--[为什么真正的应用都是用while(条件)而不用if(条件)]
在实际的编程中我们看到大量的例子都是用?
while(x < 100)
wait();go();而不是用if,为什么呢?
在多个线程同时执行时,if(x <100)是不安全的.因为如果线程A和线程B都在t的休息室中等待,这时另一个线程使x==100了,并调用notifyAll方法,线程A继续 执行下面的go().而它执行完成后,x有可能又小于100,比如下面的程序中调用了--x,这时切换到线程B,线程B没有继续判断,直接执行go(); 就产生一个错误的条件,只有while才能保证线程B又继续检查一次.
---继承Thread类,复写run()方法,调用start()
/* * extends Thread */ public class ThreadTest extends Thread { private String name; public ThreadTest() { } public ThreadTest(String name) { this.name = name; } public void run() { for (int i = 0; i < 5; i++) { System.out.println(name + "运行 " + i); } } public static void main(String[] args) { ThreadTest h1 = new ThreadTest("A"); ThreadTest h2 = new ThreadTest("B"); h1.start(); h2.start(); } }
---实现Runnable接口,复写run()方法,传入进新创建的Thread,调用start()
/* * implements Runnable */ public class RunnableTest implements Runnable { private String name; public RunnableTest() { } public RunnableTest(String name) { this.name = name; } public void run() { for (int i = 0; i < 5; i++) { System.out.println(name + "运行 " + i); } } public static void main(String[] args) { RunnableTest h1 = new RunnableTest("线程A"); Thread demo = new Thread(h1); RunnableTest h2 = new RunnableTest("线程B"); Thread demo1 = new Thread(h2); demo.start(); demo1.start(); // RunnableTest runner = new RunnableTest(); // Thread thread = new Thread(runner); // thread.start(); } }
---匿名内部类
new Thread(new Runnable() { @Override public void run() { //todo:final } }).start();