带你玩转java多线程系列 二 Thread 和 Runnable

Thread 和 Runnable

1 Runnable是接口,而Thread是继承,可以同时实现多个接口,但是不能同时继承多个类
2 Runnable比Thread灵活的多
 
当我们使用Runnable测试多线程非常简单,因为Runnable是对Thread的进一步解耦
我们首先建立一个类记做为Model,实现Runnable接口,在类里建立一个实例变量,接着覆盖run方法。
我们重新建立一个含有main函数的类,在该类中我们首先建立一个Model类型的实例变量model,接着将该Runnable类的实例
作为参数传递给Thread类型对象,并且调用Thread类的start方法。
public class teach1 {

    public static void main(String[] args) {

        Model model = new Model();

        new Thread(model).start();

        new Thread(model).start();

    }

}

class Model implements Runnable{

    int num = 20;

 

    @Override

    public void run() {

        // TODO Auto-generated method stub

        while(num>0){

            System.out.println(Thread.currentThread().getName()+" "+num);

            num--;

        }

    }

}
运行结果如下
Thread-0 20
Thread-0 19
Thread-0 18
Thread-1 20
Thread-0 17
Thread-0 15
Thread-1 16
Thread-0 14
Thread-0 12
Thread-0 11
Thread-0 10
Thread-0 9
Thread-0 8
Thread-0 7
Thread-1 13
Thread-1 5
Thread-1 4
Thread-1 3
Thread-1 2
Thread-1 1
Thread-0 6
显然出现了线程安全问题,在系列三中我将写出synchronized的解决方法
假如你使Model继承Thread显然你在想在其他类里来实验java的多线程安全显然是非常难的,因为继承Thread耦合度非常的高。无法再另一个新的类
对该成员变量num进行开多个线程操作 真的发现如果继承Thread类无法进行安全性实验啊  兄弟们给指点一下啊
class Model extends Thread{

    int num = 20;

 

    @Override

    public void run() {

        // TODO Auto-generated method stub

        while(num>0){

            System.out.println(Thread.currentThread().getName()+" "+num);

            num--;

        }

    }

}

我怎么想也不能再另一个类里对该类的成员变量num进行开多个线程操作

原文地址:https://www.cnblogs.com/winAlaugh/p/5474734.html