现在的位置: 首页 > 综合 > 正文

Java学习笔记_多线程处理

2017年12月27日 ⁄ 综合 ⁄ 共 2458字 ⁄ 字号 评论关闭

基础: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();

抱歉!评论已关闭.