目录java
进程:进程指正在运行的程序。确切的来讲,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程当中的程序,而且每一个进程都具备必定独立功能。
线程:线程是进程中的一个执行单元,来完成进程中的某个功能。负责当前进程中程序的执行,一个进程中至少有一个线程。一个进程中是能够有多个线程的,这个应用程序也能够称之为多线程程序。
简而言之:一个程序运行后至少有一个进程,一个进程中能够包含多个线程。多线程
继承Thread类建立线程并发
public class ThreadTest extends Thread{ private int i; public void run() { for(i=0;i<50;i++) { //当线程继承Thread类的时候,直接调用this便可获取当前的进程 //Thread类的getName()方法会返回线程的名字 System.out.println(getName()+" "+i); } } public static void main(String[] args) { for(int i =0;i<50;i++) { System.out.println(Thread.currentThread().getName()+" "+i); if(i==10) { //建立第一个线程 new ThreadTest().start(); //建立第二个线程 new ThreadTest().start(); } } } }
实现Runnable接口建立线程类ide
public class RunnableTest implements Runnable { private int i; @Override public void run() { for(i=0;i<50;i++) { System.out.println(Thread.currentThread().getName()+" "+i); } } public static void main(String[] args) { for(int i =0;i<50;i++) { System.out.println(Thread.currentThread().getName()+" "+i); if(i==10) { RunnableTest rs = new RunnableTest(); new Thread(rs).start(); new Thread(rs).start(); } } } }
实现Runnable的原理和好处函数
使用线程的内匿名内部类方式,能够方便的实现每一个线程执行不一样的线程任务操做。this
new Thread() { public void run() { for (int i = 0; i < 10; i++) { System.out.println(getName() + " " + i); } } }.start();
new Thread(new Runnable() { public void run() { for (int i = 0; i < 10; i++) { System.out.println(Thread.currentThread().getName() + " " + i); } } }).start();
new Thread("yyy") { public void run() { //do something... } }.start();
new Thread() { public void run() { this.setName("abc"); for(int i = 0; i < 100; i++) { System.out.println(this.getName() + "....bb"); } } }.start();
Thread t1 = new Thread() { public void run() { for(int i = 0; i < 50; i++) { System.out.println(getName() + "...aaaaaaaaaaaaaaaaaaaaaa"); try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } } } }; Thread t2 = new Thread() { public void run() { for(int i = 0; i < 2; i++) { System.out.println(getName() + "...bb"); try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } } } }; t1.setDaemon(true); //将t1设置为守护线程 t1.start(); t2.start(); //运行结果 Thread-1...bb Thread-0...aaaaaaaaaaaaaaaaaaaaaa Thread-0...aaaaaaaaaaaaaaaaaaaaaa Thread-1...bb Thread-0...aaaaaaaaaaaaaaaaaaaaaa
final Thread t1 = new Thread() { public void run() { for(int i = 0; i < 100; i++) { System.out.println(getName() + "...aaaaaaaaaaaaaaaaaaaaaa"); } } }; Thread t2 = new Thread() { public void run() { for(int i = 0; i < 100; i++) { System.out.println(getName() + "...bb"); try { t1.join(); } catch (InterruptedException e) { e.printStackTrace(); } } } }; t1.start(); t2.start();
public class ThreadT { public void print1() { synchronized (ThreadT.class) { System.out.print("1"); System.out.print("2"); System.out.print("3"); System.out.print("\r\n"); } } public void print2() { synchronized (ThreadT.class) { System.out.print("a"); System.out.print("b"); System.out.print("c"); System.out.print("\r\n"); } } public static void main(String[] args) { ThreadT tT = new ThreadT(); Thread t1 = new Thread() { public void run() { for (int i = 0; i < 100; i++) { tT.print1(); } } }; Thread t2 = new Thread() { public void run() { for (int i = 0; i < 100; i++) { tT.print2(); } } }; t1.start(); t2.start(); } }
public class ThreadT { public synchronized void print1() { System.out.print(Thread.currentThread().getName()+"----"); System.out.print("1"); System.out.print("2"); System.out.print("3"); System.out.print("\r\n"); } public synchronized void print2() { System.out.print(Thread.currentThread().getName()+"----"); System.out.print("a"); System.out.print("b"); System.out.print("c"); System.out.print("\r\n"); } public static void main(String[] args) { ThreadT tT = new ThreadT(); Thread t1 = new Thread() { public void run() { for (int i = 0; i < 1000; i++) { tT.print1(); } } }; Thread t2 = new Thread() { public void run() { for (int i = 0; i < 1000; i++) { tT.print2(); } } }; t1.start(); t2.start(); } } //输出结果(一部分) Thread-0----123 Thread-0----123 Thread-1----abc Thread-1----abc Thread-1----abc Thread-0----123 Thread-0----123
多个线程并发执行时,在默认状况下CPU是随机切换线程的。若是咱们但愿他们有规律的执行,就可使用通讯,例如每一个线程执行一次打印。
若是但愿线程等待,就调用wait(),若是但愿唤醒等待的线程,就调用notify();这两个方法必须在同步代码中执行,而且使用同步锁对象来调用。notifyAll()方法是唤醒全部线程,JDK5以前没法唤醒指定的一个线程,若是多个线程之间通讯,须要使用notifyAll()通知全部线程,用while来反复判断条件。线程
public class ThreadT { private int flag = 1; public synchronized void print1() { try { /* if (flag != 1) { //if 语句是在那里等待就在那里起来 this.wait(); }*/ while(flag != 1){ this.wait(); //while循环是循环判断,每次都会判断标记 } System.out.print("1"); System.out.print("2"); System.out.print("3"); System.out.print("\r\n"); flag = 2; //this.notify(); this.notifyAll(); } catch (InterruptedException e) { e.printStackTrace(); } } public synchronized void print2() { try { while(flag != 2){ this.wait(); } System.out.print("a"); System.out.print("b"); System.out.print("c"); System.out.print("\r\n"); flag = 3; this.notifyAll(); } catch (InterruptedException e) { e.printStackTrace(); } } public synchronized void print3() { try { while(flag != 3){ this.wait(); } System.out.print("+"); System.out.print("-"); System.out.print("*"); System.out.print("\r\n"); flag = 1; this.notifyAll(); } catch (InterruptedException e) { e.printStackTrace(); } } public static void main(String[] args) { ThreadT tT = new ThreadT(); Thread t1 = new Thread() { public void run() { for (int i = 0; i < 100; i++) { tT.print1(); } } }; Thread t2 = new Thread() { public void run() { for (int i = 0; i < 100; i++) { tT.print2(); } } }; Thread t3 = new Thread() { public void run() { for (int i = 0; i < 100; i++) { tT.print3(); } } }; t1.start(); t2.start(); t3.start(); } } //输出结果(一部分) ...... abc +-* 123 abc +-* 123 ......
使用ReentrantLock类的lock()和unlock()方法进行同步。使用Condition的await()和signal()来暂停和唤醒线程设计
public class ThreadT { private int flag = 1; private ReentrantLock rlock = new ReentrantLock(); private Condition c1 = rlock.newCondition(); private Condition c2 = rlock.newCondition(); private Condition c3 = rlock.newCondition(); public void print1() { rlock.lock(); //得到锁 try { while (flag != 1) { c1.await(); //使当前线程等待,直到发出信号或中断 } System.out.print("1"); System.out.print("2"); System.out.print("3"); System.out.print("\r\n"); flag = 2; c2.signal(); //唤醒等待线程。 } catch (InterruptedException e) { e.printStackTrace(); } finally { rlock.unlock(); //释放锁 } } public void print2() { rlock.lock(); try { while (flag != 2) { c2.await(); } System.out.print("a"); System.out.print("b"); System.out.print("c"); System.out.print("\r\n"); flag = 3; c3.signal(); } catch (InterruptedException e) { e.printStackTrace(); } finally { rlock.unlock(); } } public void print3() { rlock.lock(); try { while (flag != 3) { c3.await(); } System.out.print("+"); System.out.print("-"); System.out.print("*"); System.out.print("\r\n"); flag = 1; c1.signal(); } catch (InterruptedException e) { e.printStackTrace(); } finally { rlock.unlock(); } } public static void main(String[] args) { ThreadT tT = new ThreadT(); Thread t1 = new Thread() { public void run() { for (int i = 0; i < 100; i++) { tT.print1(); } } }; Thread t2 = new Thread() { public void run() { for (int i = 0; i < 100; i++) { tT.print2(); } } }; Thread t3 = new Thread() { public void run() { for (int i = 0; i < 100; i++) { tT.print3(); } } }; t1.start(); t2.start(); t3.start(); } }