1、线程的创建方法:继承Thread类,实现Runable接口;
2、继承Thread类创建的线程,复写run方法即可,然后使用start方法启动线程;
3、实现Runable接口的线程,其实与线程没有直接关系,就算有了run方法,要明确与线程有直接关系的是Thread类,创建线程还是要依赖Thread类的,所以一个实现Runable的类并且有run方法,要是使用Thread的构造方法才能真正创建线程,然后必须使用Thread的start方法,才能启动一个线程;
4、线程的状态:新建、就绪、运行、死亡、阻塞;
5、线程的安全:设想一个共享资源也就是临界资源,多个线程同时访问的时候,由于CPU的执行权的不确定性,就会造成共享资源的不安全,解决办法很简单,就是将共享代码块加上同步,或者将一个共享函数加上同步,变为同步函数;这时候还要强调一点:加同步的时候需要一个锁对象,可以是任意对象,当然执行效率降低了;当一个临界资源被多线程访问的时候,并且线程是同步的,但是使用的锁对象不是同一个,就容易进入死锁的状态;
6、一个单例模式(安全高效):懒汉式
class Single{
private Static Single s=null;
private Single(){}
Public Static Single getInstance(){
if(s==null){
synchronized(Single.class){
if(s==null)
return s= new Single();
}
}
}
}
7、线程的通信:在设想一种情况,一个共享资源,被多个线程访问,并且这个资源被各个线程的run方法所操作行为不一样,典型的便是生产者和消费者,一个生产一个消费,此时,便涉及到了线程的通信问题,当然解决办法依然是加同步,除此以外,你要考虑:当一个线程执行完后,如何通知其他相应的线程去执行,下面是一个简单完整的生产者和消费者的实例,体会一下线程间的通信不同之处:
class ProducerConsumerDemo{ public static void main(String[] args) { Resource r = new Resource(); Producer pro = new Producer(r); Consumer con = new Consumer(r); Thread t1 = new Thread(pro); Thread t2 = new Thread(pro); Thread t3 = new Thread(con); Thread t4 = new Thread(con); t1.start(); t2.start(); t3.start(); t4.start(); }}/*对于多个生产者和消费者。为什么要定义while判断标记。原因:让被唤醒的线程再一次判断标记。为什么定义notifyAll,因为需要唤醒对方线程。因为只用notify,容易出现只唤醒本方线程的情况。导致程序中的所有线程都等待。*/class Resource{ private String name; private int count = 1; private boolean flag = false; // t1 t2 public synchronized void set(String name) { while(flag) try{this.wait();}catch(Exception e){}//t1(放弃资格) t2(获取资格) this.name = name+"--"+count++; System.out.println(Thread.currentThread().getName()+"...生产者.."+this.name); flag = true; this.notifyAll(); } // t3 t4 public synchronized void out() { while(!flag) try{wait();}catch(Exception e){}//t3(放弃资格) t4(放弃资格) System.out.println(Thread.currentThread().getName()+"...消费者........."+this.name); flag = false; this.notifyAll(); }}class Producer implements Runnable{ private Resource res; Producer(Resource res) { this.res = res; } public void run() { while(true) { res.set("+商品+"); } }}class Consumer implements Runnable{ private Resource res; Consumer(Resource res) { this.res = res; } public void run() { while(true) { res.out(); } }}
下面给出最新版本的实例:
import java.util.concurrent.locks.*;class ProducerConsumerDemo2{ public static void main(String[] args) { Resource r = new Resource(); Producer pro = new Producer(r); Consumer con = new Consumer(r); Thread t1 = new Thread(pro); Thread t2 = new Thread(pro); Thread t3 = new Thread(con); Thread t4 = new Thread(con); t1.start(); t2.start(); t3.start(); t4.start(); }}/*JDK1.5 中提供了多线程升级解决方案。将同步Synchronized替换成现实Lock操作。将Object中的wait,notify notifyAll,替换了Condition对象。该对象可以Lock锁 进行获取。该示例中,实现了本方只唤醒对方操作。Lock:替代了Synchronized lock unlock newCondition()Condition:替代了Object wait notify notifyAll await(); signal(); signalAll();*/class Resource{ private String name; private int count = 1; private boolean flag = false; // t1 t2 private Lock lock = new ReentrantLock(); private Condition condition_pro = lock.newCondition(); private Condition condition_con = lock.newCondition(); public void set(String name)throws InterruptedException { lock.lock(); try { while(flag) condition_pro.await();//t1,t2 this.name = name+"--"+count++; System.out.println(Thread.currentThread().getName()+"...生产者.."+this.name); flag = true; condition_con.signal(); } finally { lock.unlock();//释放锁的动作一定要执行。 } } // t3 t4 public void out()throws InterruptedException { lock.lock(); try { while(!flag) condition_con.await(); System.out.println(Thread.currentThread().getName()+"...消费者........."+this.name); flag = false; condition_pro.signal(); } finally { lock.unlock(); } }}class Producer implements Runnable{ private Resource res; Producer(Resource res) { this.res = res; } public void run() { while(true) { try { res.set("+商品+"); } catch (InterruptedException e) { } } }}class Consumer implements Runnable{ private Resource res; Consumer(Resource res) { this.res = res; } public void run() { while(true) { try { res.out(); } catch (InterruptedException e) { } } }}
8、线程的其他要点:
线程的优先级、线程的停止;守护线程