Java多线程学习笔记(全)
一.线程的创建和启动
java使用Thread类代表线程,所有的线程对象都必须是Thread类或其子类的实例。每条线程
的作用是完成一定的任务,实际上就是执行一段程序流(一段顺序流的代码)。Java使用run方法
来封装这样一段程序。
1.继承Thread类创建线程类
/**继承Thread来创建线程类*/
public class FirstThread extends Thread {
private int i;
//重写run方法,run方法的方法体就是线程执行体
public void run() {
for(;i<10;i++){
System.out.println(this.getName()+":"+i);
}
}
public static void main(String []args){
for(int i=0;i<20;i++){
System.out.println(Thread.currentThread().getName()+" .."+i);
if(i==10){
System.out.println("");
new FirstThread().start();
new FirstThread().start();
System.out.println("");
}
}
}
}
结果:红色部分每次运行都不一致,因为多线程也是并发的
main ..0
main ..1
main ..2
main ..3
main ..4
main ..5
main ..6
main ..7
main ..8
main ..9
main ..10
Thread-0:0
Thread-1:0
Thread-1:1
Thread-1:2
Thread-1:3
Thread-0:1
Thread-1:4
Thread-1:5
main ..11
Thread-1:6
Thread-1:7
Thread-1:8
Thread-1:9
Thread-0:2
Thread-0:3
main ..12
main ..13
总结 :从上面结果可以看出Thread-0和Thread-1两条线程输出的 i变量都不连续(注意:i
变量是 FirestThread 的实例属性,而不是局部变量,但因为程序每次创建线程都会创建一个
FirstThread对象,所以Thread-0和Thread-1不能共享该实例属性)。
使用继承Thread类的方法来创建线程类,多条线程之间无法共享线程类的实例变量。
2.实 Runnable接口创建线程类
public class SecondThread implements Runnable {
private int i;
public void run() {
for(;i<20;i++){
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
public static void main(String [] args){
for(int i=0;i<20;i++){
System.out.println(Thread.currentThread().getName()+" .."+i);
if(i==10){
SecondThread st=new SecondThread();
//通过new Thread (Runable target,String name)来创建新线程
new Thread(st,"线程1").start();
new Thread(st,"线程2").start();
}
}
}
结果:红色部分每次运行都不一致,因为多线程也是并发的
main