对于Java开发人员,多线程应该是必须熟练应用的知识点,特别是开发基于Java语言的产品。本文将简单讲解Java多线程的知识点。
讲解线程之前,先跟大家说一下易混淆的两个概念:进程和线程。
进程:
进程是指一个内存中运行的应用程序(比如一个运行的exe就是一个进程)。
线程:
线程是指进程中的一个执行流程,一个进程可以运行多个线程。
下面我们来剖析一下线程的执行:
1、线程的创建和启动
创建线程:有两种方式
1)继承java.lang.Thread类,直接new实例化线程。
2)实现java.lang.Runnable接口,用Thread的构造方法实例化线程。
启动线程
调用Thread的start()方法。
例1-1:继承Thread类的多线程示例
public class TestThread extends Thread{
public TestThread(String name) {
super(name);
}
public void run() {
for(int i = 0;i<5;i++){
for(long k= 0; k <100000000;k++);
System.out.println(this.getName()+" :"+i);
}
}
public static void main(String[] args) {
Thread t1 = new TestThread("线程一");
Thread t2 = new TestThread("线程二");
t1.start();
t2.start();
}
}
例1-2:实现Runnable接口的多线程示例
public class MyThread implements Runnable {
private String name;
public MyThread (String name) {
this.name = name;
}
public void run() {
for (int i = 0; i < 5; i++) {
for (long k = 0; k < 100000000; k++) ;
System.out.println(name + ": " + i);
}
}
}
public class TestRunnable {
public static void main(String[] args) {
MyThread mt1 = new MyThread ("线程一");
MyThread mt2 = new MyThread ("线程二");
Thread t1 = new Thread(mt1);
Thread t2 = new Thread(mt2);
t1.start();
t2.start();
}
}
2、线程的状态转换
3、线程的调度
线程的调度有休眠(sleep),优先级(setPriority),让步(yield),合并(join)。
线程不同的调度使它转换成不同的状态(可参考2中的状态转换表)。
4、线程同步与锁
一个对象只有一个锁。所以,如果一个线程获得该锁,就没有其他线程可以获得锁,直到第一个线程释放(或返回)锁。这也意味着任何其他线程都不能进入该对象上的synchronized方法或代码块,直到该锁被释放。