Java并发编程(一) 两种实现多线程的方法(Thread,Runnable)

Java中实现多线程的方法有两种:

  继承Thread类和实现Runnable方法,并重写Run方法,然后调用start()方法启动线程。使用Runnable会比Thread要好很多,主要是以下三个原因:

    (1)Java语言是单继承的,如果继承了Thread类,那么便无法继承其他类。

    (2)适合多个相同程序代码的线程区处理同一资源的情况。

测试(Thread类)

package com.csdhsm.concurrent;

/**
 * @Title: ThreadDemo.java
 * @Package: com.csdhsm.concurrent
 * @Description 继承Thread测试
 * @author Han
 * @date 2016-4-18 下午3:45:30
 * @version V1.0
 */ 

public class ThreadDemo extends Thread {

    private int ticket = 3;
    private int id;

    public ThreadDemo(int id) {

        this.id = id;
    }

    @Override
    public void run() {

        while(ticket > 0){

            System.out.println(this.id + " --> " + ticket--);
        }
    }

    public static void main(String[] args) {

        new ThreadDemo(1).start();
        new ThreadDemo(2).start();
        new ThreadDemo(3).start();
    }
}

结果

测试(Runnable类)

package com.csdhsm.concurrent;

/**
 * @Title: RunnableDemo.java
 * @Package: com.csdhsm.concurrent
 * @Description 实现Runnale接口
 * @author Han
 * @date 2016-4-18 下午3:47:40
 * @version V1.0
 */ 

public class RunnableDemo implements Runnable{

    private int ticket = 5;
    private int id;

    public RunnableDemo(int id) {

        this.id = id;
    }

    @Override
    public void run() {

        while(ticket > 0){

            System.out.println(this.id + " --> " + ticket--);
        }
    }

    public static void main(String[] args) {

        RunnableDemo demo = new RunnableDemo(1);

        new Thread(demo).start();
        new Thread(demo).start();
        new Thread(demo).start();
    }
}

结果

总结

  1.在绝大多数的并发编程时都是使用继承Runnable接口的方法。

  2.在上面的示例中,使用Thread类时,必须要每次都实例化对象,所以每个线程分别有各自的资源。而在第二种方法中,我们同样也new了3个Thread对象,但只有一个Runnable对象,3个Thread对象共享这个Runnable对象中的代码,因此,便会出现3个线程共同完成卖票任务的结果。

时间: 2024-11-05 06:22:00

Java并发编程(一) 两种实现多线程的方法(Thread,Runnable)的相关文章

Java并发编程(8):多线程环境中安全使用集合API(含代码)

Java并发编程(8):多线程环境中安全使用集合API(含代码)JAVA大数据中高级架构 2018-11-09 14:44:47在集合API中,最初设计的Vector和Hashtable是多线程安全的.例如:对于Vector来说,用来添加和删除元素的方法是同步的.如果只有一个线程与Vector的实例交互,那么,要求获取和释放对象锁便是一种浪费,另外在不必要的时候如果滥用同步化,也有可能会带来死锁.因此,对于更改集合内容的方法,没有一个是同步化的.集合本质上是非多线程安全的,当多个线程与集合交互时

Go -- 并发编程的两种限速方法

引子 golang提供了goroutine快速实现并发编程,在实际环境中,如果goroutine中的代码要消耗大量资源时(CPU.内存.带宽等),我们就需要对程序限速,以防止goroutine将资源耗尽.以下面伪代码为例,看看goroutine如何拖垮一台DB.假设userList长度为10000,先从数据库中查询userList中的user是否在数据库中存在,存在则忽略,不存在则创建. //不使用goroutine,程序运行时间长,但数据库压力不大 for _,v:=range userLis

Java并发编程(三)后台线程(Daemon Thread)

后台线程,守护线程(Daemon Thread) 所谓的后台线程,就是指这种线程并不属于程序中不可或缺的部分,因此当所有的非后台线程结束时,程序也就终止了,同时会杀死进程中的所有后台线程.通过setDaemon(true)来设置该线程为后台线程. package com.csdhsm.concurrent; import java.util.concurrent.TimeUnit; /** * @Title: SimpleDaemonThreadDemo.java * @Package: com

【Java并发编程实战】—–“J.U.C”:Semaphore

信号量Semaphore是一个控制访问多个共享资源的计数器,它本质上是一个"共享锁". Java并发提供了两种加锁模式:共享锁和独占锁.前面LZ介绍的ReentrantLock就是独占锁.对于独占锁而言,它每次只能有一个线程持有,而共享锁则不同,它允许多个线程并行持有锁,并发访问共享资源. 独占锁它所采用的是一种悲观的加锁策略,  对于写而言为了避免冲突独占是必须的,但是对于读就没有必要了,因为它不会影响数据的一致性.如果某个只读线程获取独占锁,则其他读线程都只能等待了,这种情况下就限

Java并发编程ReentrantReadWriteLock

基于AQS的前世今生,来学习并发工具类ReentrantReadWriteLock.本文将从ReentrantReadWriteLock的产生背景.源码原理解析和应用来学习这个并发工具类. 1. 产生背景 前面我们学习的重入锁ReentrantLock本质上还是互斥锁,每次最多只能有一个线程持有ReentrantLock.对于维护数据完整性来说,互斥通常是一种过于强硬的规则,因此也就不必要的限制了并发性.互斥是一种保守的加锁策略,虽然可以避免"写/写"冲突和"写/读"

java并发编程--Runnable Callable及Future

1.Runnable Runnable是个接口,使用很简单: 1. 实现该接口并重写run方法 2. 利用该类的对象创建线程 3. 线程启动时就会自动调用该对象的run方法 通常在开发中结合ExecutorService使用,将任务的提交与任务的执行解耦开,同时也能更好地利用Executor提供的各种特性 ExecutorService executor = Executors.newCachedThreadPool(); executor.submit(new Runnable() { pub

19、Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition

Java并发编程:线程间协作的两种方式:wait.notify.notifyAll和Condition 在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者模型:当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期间内,生产者必须释放对临界资源(即队列)的占用权.因为生产者如果不释放对临界资源的占用权,那么消费者就无法消费队列中的商品,就不会让队列有空间,那么生产者就会一直无限等待下去.因此,一般情况下,当队列满时,会让生产者交出对

Java并发编程、多线程、线程池…

Java多线程干货系列(1):Java多线程基础http://www.importnew.com/21136.html#comment-651146 40个Java多线程问题总结http://www.importnew.com/18459.html#comment-651217 Java线程面试题 Top 50http://www.importnew.com/12773.html Java并发编程:Thread类的使用http://www.cnblogs.com/dolphin0520/p/39

Java并发编程之多线程同步

线程安全就是防止某个对象或者值在多个线程中被修改而导致的数据不一致问题,因此我们就需要通过同步机制保证在同一时刻只有一个线程能够访问到该对象或数据,修改数据完毕之后,再将最新数据同步到主存中,使得其他线程都能够得到这个最新数据.下面我们就来了解Java一些基本的同步机制. Java提供了一种稍弱的同步机制即volatile变量,用来确保将变量的更新操作通知到其他线程.当把变量声明为volatile类型后,编译器与运行时都会注意到这个变量是共享的.然而,在访问volatile变量时不会执行加锁操作