带你玩转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进行开多个线程操作

时间: 2024-10-05 13:49:05

带你玩转java多线程系列 二 Thread 和 Runnable的相关文章

带你玩转java多线程系列 “道篇” 多线程的优势及利用util.concurrent包测试单核多核下多线程的效率

java多线程 “道篇” - 多线程的优势及用concurrent包测试单核多核下多线程的效率 1 超哥对于多线程自己的理解 2 测试代码 3 CountDownLatch这个同步辅助类科普 4 如何把电脑设置成单核 5 测试结果 1 超哥对于多线程自己的理解 超哥的理解:对于多线程,无非是对于顺序执行下任务的一种抽取和封装,将原来顺序执行的任务单独拿出来放到线程类的run方法中,通过线程类的start方法进行执行,对于多线程访问共同资源时,我们需要加锁,也就是只有某个线程在拥有锁的时候,才能够

Java多线程系列二——Thread类的方法

Thread实现Runnable接口并实现了大量实用的方法 public static native void yield(); 此方法释放CPU,但并不释放已获得的锁,其它就绪的线程将可能得到执行机会,它自己也有可能再次得到执行机会 public static native void sleep(long millis) throws InterruptedException; 此方法释放CPU,但并不释放已获得的锁,其它就绪的线程将得到执行机会,在休眠时间结束后,当前线程继续执行 publi

带你玩转java多线程系列 一 java.lang.IllegalThreadStateException异常

java的线程状态和java.lang.IllegalThreadStateException异常 文章结构: 1 阐明java声明周期的六种状态 2 由于自己操作错误,对同一个线程实例同时调用了两次start方法从而抛了java.lang.IllegalThreadStateException这个异常 3 超哥带你分析为啥抛了这个异常 4 超哥想看到赞 哈哈 1 阐明java声明周期的六种状态 线程的生命周期有六种,由Thread.State枚举类表示,线程的状态可以用getState方法来查

Android进阶——多线程系列之Thread、Runnable、Callable、Future、FutureTask

多线程系列之Thread.Runnable.Callable.Future.FutureTask 前言 多线程一直是初学者最抵触的东西,如果你想进阶的话,那必须闯过这道难关,特别是多线程中Thread.Runnable.Callable.Future.FutureTask这几个类往往是初学者容易搞混的.这里先总结这几个类特点和区别,让大家带着模糊印象来学习这篇文章 Thread.Runnable.Callable:都是线程 Thread特点:提供了线程等待.线程睡眠.线程礼让等操作 Runnab

java多线程系列(二)

对象变量的并发访问 前言:本系列将从零开始讲解java多线程相关的技术,内容参考于<java多线程核心技术>与<java并发编程实战>等相关资料,希望站在巨人的肩膀上,再通过我的理解能让知识更加简单易懂. 目录 认识cpu.核心与线程 java多线程系列(一)之java多线程技能 java多线程系列(二)之对象变量的并发访问 java多线程系列(三)之等待通知机制 java多线程系列(四)之ReentrantLock的使用 线程安全 线程安全就是多线程访问时,采用了加锁机制,当一个

Java多线程系列

参考资料: http://www.jianshu.com/p/40d4c7aebd66 0.环境 Java: jdk1.8.0_91 CPU: Intel Core i5-6500 Memory: 8G 1.说明 本系列文章为Java多线程的学习记录 Java多线程系列一--Java实现线程方法 Java多线程系列二--Thread类的方法 Java多线程系列三--实现线程同步的方法 Java多线程系列四--控制线程执行顺序 Java多线程系列五--列表类 Java多线程系列六--Map实现类

Java多线程系列--&ldquo;JUC锁&rdquo;04之 公平锁(二)

前面一章,我们学习了"公平锁"获取锁的详细流程:这里,我们再来看看"公平锁"释放锁的过程."公平锁"的获取过程请参考"Java多线程系列–"JUC锁"03之 公平锁(一)",锁的使用示例请参考"Java多线程系列–"JUC锁"02之 互斥锁ReentrantLock". 注意(01)这里是以"公平锁"来进行说明.(02)关于本章的术语,如"

java多线程系列(三)

等待通知机制 前言:本系列将从零开始讲解java多线程相关的技术,内容参考于<java多线程核心技术>与<java并发编程实战>等相关资料,希望站在巨人的肩膀上,再通过我的理解能让知识更加简单易懂. 目录 认识cpu.核心与线程 java多线程系列(一)之java多线程技能 java多线程系列(二)之对象变量的并发访问 java多线程系列(三)之等待通知机制 java多线程系列(四)之ReentrantLock的使用 非等待通知 public void run() { try {

java多线程系列(一)

java多线程技能 前言:本系列将从零开始讲解java多线程相关的技术,内容参考于<java多线程核心技术>与<java并发编程实战>等相关资料,希望站在巨人的肩膀上,再通过我的理解能让知识更加简单易懂. 目录 认识cpu.核心与线程 java多线程系列(一)之java多线程技能 java多线程系列(二)之对象变量的并发访问 java多线程系列(三)之等待通知机制 java多线程系列(四)之ReentrantLock的使用 并发历史 在没有操作系统的时候,一台计算机只执行一个程序,