首先了解什么是多线程与进程
进程:是一个执行过程,动态的概念 --->会分配内存
线程:是进程的一个单元,线程是系统最小的执行单元
详解: http://blog.csdn.net/luoweifu/article/details/46595285线程的同步与锁详解:
http://blog.51cto.com/lavasoft/99155
synchronized的使用概括:
1.synchronized只锁定同一个对象中的线程,不同对象的线程无法锁定。锁定的对象只能由当前线程执行,其他线程不能执行,直到当前线程被释放。
2.当一个线程访问对象的一个synchronized(this)同步代码块时,另一个线程可以访问这个对象中的非synchronized(this)代码块
3.给一个对象加锁,在run方法中可对一个对象加锁,是的同时只能由一个线程访问此被加锁的对象,其他试图访问account对象的线程将会阻塞,直到该线程访问account对象结束
4.修饰一个方法:
public synchronized void method() { }在用synchronized修饰方法时要注意以下几点:
(1) synchronized关键字不能继承。
(2)在定义接口方法时不能使用synchronized关键字。
(3)构造方法不能使用synchronized关键字,但可以使用synchronized代码块来进行同步。
5.修饰一个静态方法:
静态方法是属于类的而不属于对象的。同样的,synchronized修饰的静态方法锁定的是这个类的所有对象,即此类的所有的对象都受这个同步锁的约束,这与1中的情况不同。
6.修饰一个类,作用同5一样
java中线程锁:一个对象只能有一个锁,当一个线程获得锁之后,其他线程就无法获得,直到这个线程被释放,重要作用就是:防止多个线程同时对一个数据进行处理造成错误
synchronized的使用详解 http://blog.csdn.net/luoweifu/article/details/46613015Thread中的sleep、wait、yield、notify、notifyall、join方法
sleep()方法会让当前线程暂停执行指定的时间,将执行机会(cpu)让给其他线程,但是对象的锁依然保持,因此休眠时间结束后会自动恢复,且sleep方法暂停后,其他线程都可以有执行的机会,包括低优先级的线程
yield方法与sleep方法类似,但是不能指定用户暂停多长时间,且只能让通优先级的线程有执行的机会
join,使调用join方法的线程执行完毕后,其他线程才能够继续执行,即顺序执行
t1.start(); //等待t1结束,这时候t2线程并未启动 t1.join(); //t1结束后,启动t2线程 t2.start(); //等待t2结束 t2.join();
wait()、notify()、notifyall()都是是object类的方法,wait会让当前线程放弃对象的锁(线程暂停执行),进入对象等待池,只有调用对象的notify方法才能唤醒等待池中的线程进入等锁池,如果线程重新获得对象的锁就可以进入就绪状态。
notifyall方法则是将对象等待池中的所有等待那个对象的线程放到等锁池中
线程的创建方式:1.继承Thread类实现其中的run方法,在run方法中实现执行代码
public class JavaThread extends Thread{ @Override public void run() { boolean flag= true; int i = 0; while(flag){ System.out.println(getName()+"我是线程1"); if(i++==100){ break; } } System.out.println("我要走了"); }此方法需要用Thread类new一个线程,然后调用start()方法启用线程
Thread th = new JavaThread(); th.setName("哈哈哈"); th.start();2.实现runnable接口,实现其中的run方法
class Actress implements Runnable{ @Override public void run() { boolean flag= true; int i = 0; while(flag){ System.out.println(Thread.currentThread().getName()+"我是线程2"); if(i++==100){ break; } } } }
Thread t1 = new Thread(new Actress()); actressTh.start();