一、多线程有两种实现方式:
1、通过继承Thread
2、实现Runnable
因为java是单继承,如果通过继承实现多线程,想要继承其他的类就不可能了。
所以实现Runnable,就可以边继承边实现。
两种实现方式本质没有不同。
eg:函数Thread传入参数,还可以传入一个Thread对象。
二、start的启动顺序不代表线程的启动顺序。
三、自定义线程类中的实例变量对其他线程有共享与不共享之分。
1、先说不共享的情况
Thread.java
public class MyThread extends Thread {
private int count =5;
public MyThread(String name){
super();
this.setName(name);
}
public void run(){
super.run();
while (count>0){
count--;
System.out.println("由"+this.currentThread().getName()+"计算,count"+count);
}
}
}
Run.java
public class Run {
public static void main(String[] args) {
MyThread a = new MyThread("A");
MyThread b = new MyThread("B");
MyThread c = new MyThread("C");
a.start();
b.start();
c.start();
}
}
运行结果:
2、共享情况
运行结果;
但是结果出现了重复值,造成了“非线程安全”,解决这个问题,可以用synchronized关键字体。
运行结果:
加上synchronized关键字,可以使线程像队列一样访问。既 按找顺序执行线程。
非线程安全:多个线程对一个实例对象进行值的更改,出现值不同步的现象。