1.进程:一条动态执行的程序。
2、线程:进程可以近一步细化为线程。一个程序内部的一条执行路径就叫做线程。如果把进程比喻
成一座灰常大的王府,那么线程就是进出这座王府的一扇扇门。线程可以分为:用户线程、守护线程和主线程。主线程我们一般是不需要考虑的。用户线程是jvm在非守护线程都结束后自动离开,而守护线程是用来服务守护线程的。怎么说呢。。。当一个线程在所有其他的线程都结束以后仍然需要运行,我们可以将这个线程设置为守护线程,用setDaemon(true)进行设置。在java中,析构函数是典型的守护线程。3、线程的状态:新建状态、可运行状态、阻塞状态、等待状态、超时状态和终止状态。设置等待状态可以用个Thread t1=new Thread(new Program()).sleep("500")来进行设置,其中Program实现了Runnable的接口。Thread.yield()方法会暂停正在执行的线程的对象,将机会给更高优先级的或者是相同优先级的线程。
4、线程的同步:用synchronized关键字。synchronized(){}是同步块,()填的是一个唯一的地址变量,地址变量是唯一的一个,不可变更的。可以看成是一把锁,当有线程用了这把锁以后,那么别的线程就只能等待,不能重新的获取锁来打开这个同步块。
5、线程的加入:用t1.join()设置线程的加入。我发现了一个有趣的现象。先看下面的代码:
public class Program { public static void main(String[] args) { System.out.println("主线程开始。。。"); System.out.println("主线程结束。。。"); T1 t1 = new T1(); Thread thread1 = new Thread(t1); thread1.setName("t1线程"); thread1.start(); T2 t2 = new T2(); Thread thread2 = new Thread(t2); thread2.setName("t2线程"); thread2.start(); for (int i = 0; i < 500; i++) { System.out.println(Thread.currentThread().getName()+":"+i);if(i==100){
try { thread1.join(); //这里设置了当i==100的时候thread1加入主线程 } catch (InterruptedException e) { e.printStackTrace(); } } } }}class T1 implements Runnable{public void run() {
for (int i = 0; i < 500; i++) { System.out.println(Thread.currentThread().getName()+":"+i);}
} }class T2 implements Runnable{ public void run() { for (int i = 0; i < 500; i++) { System.out.println(Thread.currentThread().getName()+":"+i); } }}当在主线程里i设置了100的条件时,thread1加入线程中,可是在运行的过程中,主线程到i==100时就不会执行了,而是thread1和thread2交替执行,当thread1全部执行完时,thread2和主线程才交替运行。这个和大神说的顺序执行可是不一样的,因为这里的子线程有两个,thread1是的确是和主线程顺序执行的,但是thread2还是可以和thread1交替执行的。
6、匿名:
new Thread(new Runnable() { public void run() { for (int i = 0; i < 500; i++) { System.out.println("线程t1..."+i); } } }).start(); new Thread(new Runnable() { public void run() { for (int i = 0; i < 500; i++) { System.out.println("线程t2..."+i); } } }).start();可以在程序中把线程写成这种形式,美其名曰:匿名7.wait和notify是解决java中同步问题的重要方法,和synchronized结合使用。当synchronized方法或者是代码块中调用wait方法时,当前对象被终端运行,并且放弃该对象的锁。当另外的对象调用notify方法时会唤醒某个等待池中的某个对象,使之成为可运行的的线程。