甲乙小朋友的房子

甲乙小朋友很笨,但甲乙小朋友不会放弃

0%

多线程

线程(thread):每个任务称为一个线程 线程和进程区别: 1. 每个进程有自己独立的变量,而线程则共享数据。 2. 线程是进程的执行单元 3. 线程是进程的组成部分。一个进程可以有多个线程,一个线程必须有一个父进程。 4. 线程可以拥有自己的堆栈、自己的程序计数器和自己的局部变量,但不拥有系统资源(与父进程其它线程共享该进程则资源)

线程的创建

有以下两种方法: 1. 通过继承Thread来创建线程 2. 通过实现Runnable接口创建线程

通过继承Thread来创建线程

要点:通过继承Thread类创建并启动多线程 步骤:

  1. 定义Thread类的子类,并重写run()方法(线程执行体)

  2. 创建Thread子类的实例(创建线程对象)

  3. 调用start()(启用该线程)

    1
    2
    3
    4
    5
    6
    7
    8
    public 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

发现

  1. 两个线程共有变量i
  2. 线程间抢占资源

使用CallableFuture创建线程