线程(thread):每个任务称为一个线程 线程和进程区别: 1. 每个进程有自己独立的变量,而线程则共享数据。 2. 线程是进程的执行单元 3. 线程是进程的组成部分。一个进程可以有多个线程,一个线程必须有一个父进程。 4. 线程可以拥有自己的堆栈、自己的程序计数器和自己的局部变量,但不拥有系统资源(与父进程其它线程共享该进程则资源)
线程的创建
有以下两种方法: 1. 通过继承Thread来创建线程 2. 通过实现Runnable接口创建线程
通过继承Thread来创建线程
要点:通过继承Thread
类创建并启动多线程 步骤:
定义Thread类的子类,并重写
run()
方法(线程执行体)创建
Thread
子类的实例(创建线程对象)调用
start()
(启用该线程)1
2
3
4
5
6
7
8public class FirstThread extends Thread {
public void run(){
System.out.println("run\t"+getName()+"\t");//getName()返回thread name
}
public static void main(String[] args){
new FirstThread().start();
}
}
以上代码输出:
run Thread-0
一个有意思的现象
运行如下代码时:
1
2
3
4
5
6
7
8
9
10
11
12
13
public class FirstThread extends Thread {
public void run(){
System.out.println("run\t"+getName()+"\t");//getName()返回thread name
}
public static void main(String[] args){
//调用currentThread()获取当前线程
System.out.println("currentThread : "+Thread.currentThread().getName());
new FirstThread().start();
System.out.println("currentThread : "+Thread.currentThread().getName());
new FirstThread().start();
System.out.println("currentThread : "+Thread.currentThread().getName());
}
}
按照以前的理解,应该是:
currentThread : main
run Thread-0
currentThread : main
run Thread-1
currentThread : main
实际输出:(也有可能是其它顺序)
currentThread : main
currentThread : main
run Thread-0
run Thread-1
currentThread : main
新发现:其实start
一个线程的时候,main
线程在继续运行。main
线程不会等start
完事儿之后再运行下一句!
通过实现Runnable接口创建线程
1
2
3
4
5
6
7
8
9
public class SecondThread implements Runnable {
public void run(){
System.out.println("run\t"+Thread.currentThread().getName()+"\t");//getName()返回thread name
}
public static void main(String[] args){
SecondThread st = new SecondThread();
new Thread(st,"new_thread_1").start();
}
}
区别: 需要通过Thread.currentThread().getName()
来获取getName() main不同
多线程共享变量
以下是一个多线程共享变量i
的情况:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class SecondThread implements Runnable {
private int i;
public void run(){
while(i<5){
System.out.println("run\t"+Thread.currentThread().getName()+"\t"+i);//getName()返回thread name
i++;
}
}
public static void main(String[] args){
SecondThread st = new SecondThread();
new Thread(st,"thread_name_1").start();
new Thread(st,"thread_name_2").start();
}
}
两次运行结果:
run thread_name_1 0
run thread_name_1 1
run thread_name_1 2
run thread_name_1 3
run thread_name_2 3
run thread_name_1 4
run thread_name_1 0
run thread_name_2 0
run thread_name_1 1
run thread_name_2 2
run thread_name_1 3
run thread_name_2 4
发现:
- 两个线程共有变量
i
- 线程间抢占资源