Java多线程学习1——两种基本实现框架


一、前言

当一个Java程序启动的时候,一个线程就立刻启动,改程序通常也被我们称作程序的主线程。其他所有的子线程都是由主线程产生的。主线程是程序开始就执行的,并且程序最终是以主线程的结束而结束的。

Java编写程序都运行在在Java虚拟机(JVM)中,在JVM的内部,程序的多任务是通过线程来实现的。每用Java命令启动一个Java应用程序,就会启动一个JVM进程。在同一个JVM进程中,有且只有一个进程,就是它自己。在这个JVM环境中,所有程序代码的运行都是以线程来运行。


二、多线程的概念

通常,我们接触的简单的程序都是单线程的,但是如果我们需要进行“多线操作”的话,就需要借助多线程来实现了,对于一个进程中的多个线程来说,多个线程共享进程的内存块,当有新的线程产生的时候,操作系统不分配新的内存,而是让新线程共享原有的进程块的内存。因此,线程间的通信很容易,速度也很快。不同的进程因为处于不同的内存块,因此进程之间的通信相对困难。

在Java中,多线程的实现有两种方式:继承java.lang.Thread类;实现java.lang.Runnable接口。


三、继承Thread类来实现多线程

当一个类继承Thread类时,在类中必须重载run()方法,同时这个run()方法也是线程的入口,在调用的过程中,通过调用start()方法来启动新线程,其基本框架为:

 class 类名 extends Thread{
 方法1;
 方法2;
 …
 public void run(){
 // other code…
 }
 属性1;
 属性2;
 …

 }

在这里,我们用一个简单的窗口买票的例子来实现此类多线程

 class TestThread extends Thread
 {
     private String name;
     public TestThread(String name)
     {
         this.name=name;
     }
     public void run()
     {

         for (int i = 0; i < 7; i++)
         {
             if (num > 0)
             {
                 System.out.println(name+"正在卖票  "+"num= " + num--);
             }
         }
     }

     public static void main(String[] args)
     {

         TestThread h1 = new TestThread("窗口1");
         TestThread h2 = new TestThread("窗口2");
         TestThread h3 = new TestThread("窗口3");
         h1.start();
         h2.start();
         h3.start();
     }

     private int num = 5;
 }

在这个简单的例子中,可以很清楚的看到继承Thread实现多线程的实现已经调用,本例中运行的结果为:

 1 窗口1正在卖票  num= 5
 2 窗口1正在卖票  num= 4
 3 窗口1正在卖票  num= 3
 4 窗口1正在卖票  num= 2
 5 窗口1正在卖票  num= 1
 6 窗口2正在卖票  num= 5
 7 窗口2正在卖票  num= 4
 8 窗口2正在卖票  num= 3
 9 窗口2正在卖票  num= 2
10 窗口2正在卖票  num= 1
11 窗口3正在卖票  num= 5
12 窗口3正在卖票  num= 4
13 窗口3正在卖票  num= 3
14 窗口3正在卖票  num= 2
15 窗口3正在卖票  num= 1

并且这个结果有一定的不可预知性,我们不能够确定线程之间执行的具体顺序,同时,更为重要的,通过继承Thread实现多线程不能够实现资源的共享,以购票为例子,假设票的总数为5张的话,我们只能通过一个窗口来卖完这5张票,或者说,我们开设了三个窗口,但这个三个窗口都有5张票,这显然和我们的设计理念是有点差别的。所以,实现多线程的时候,我更喜欢使用实现Runnable接口的方法。


四、实现Runnable接口来实现多线程

和继承Thread类似,当一个类实现Runnable接口时,在类中也必须重载run()方法,同时这个run()方法也是线程的入口,在调用的过程中,通过调用start()方法来启动新线程,其基本框架为:

 class 类名 implements Runnable{
 方法1;
 方法2;
 …
 public void run(){
 // other code…
 }
 属性1;
 属性2;
 …

 }

在调用的时候会稍微有一些区别,还是以简单的窗口买票来举例说明:

 class MyThread implements Runnable
 {

     private int ticket = 5;  //5张票

     public void run()
     {
         for (int i=0; i<=20; i++)
         {
             if (this.ticket > 0)
             {
                 System.out.println(Thread.currentThread().getName()+ "正在卖票"+this.ticket--);
             }
         }
     }
 }
 public class TestThread {

     public static void main(String [] args)
     {
         MyThread my = new MyThread();
         new Thread(my, "1号窗口").start();
         new Thread(my, "2号窗口").start();
         new Thread(my, "3号窗口").start();
     }
 }

程序执行的结果为:

1 1号窗口正在卖票5
2 1号窗口正在卖票4
3 1号窗口正在卖票3
4 2号窗口正在卖票2
5 1号窗口正在卖票1

于是,我们看到了我们预先设定的效果,也就是说通过实现Runnable接口的方法,我们实现的资源的共享。


五、小结

在继承Thread类实现多线程时,我们创建了三个不同的对象,所以创建的三个线程实际上是完成的三个不同的任务,所以才会相互独立的完成;而通过实现Runable接口来实现多线程时,我们只创建了一个对象,然后实例化三个不同的线程去完成这个任务,所以相当于是共同完成任务。

其实,其实Thread类也是实现Runnable接口的,其源代码如下:

 class Thread implements Runnable {
     //…
 public void run() {
         if (target != null) {
              target.run();
         }
         }
 }

Thread中的run方法其实就是调用的是Runnable接口的run方法。方法是死的,人是活的,具体使用,可以根据实际情况来选择。如果一个类继承Thread,则不适合资源共享。但是如果实现了Runable接口的话,则突破了Java中单继承的限制,很容易的实现资源共享。

多线程是Java中非常重要的部分,本文只涉及到多线程最基本的实现以及调用的部分,例如两个例子运行可能涉及到同步的问题,运行结果可能会有所出入,今后会陆续更新一些深入的东西,希望能对后来的学习者有所帮助。

Reference:http://www.cnblogs.com/rollenholt/archive/2011/08/28/2156357.html

【Java多线程】两种基本实现框架的更多相关文章

  1. Java多线程-两种常用的线程计数器CountDownLatch和循环屏障CyclicBarrier

    Java多线程编程-(1)-线程安全和锁Synchronized概念 Java多线程编程-(2)-可重入锁以及Synchronized的其他基本特性 Java多线程编程-(3)-从一个错误的双重校验锁 ...

  2. Java多线程--两种实现方式

    进程概述: 在这之前,有必要了解一下什么是进程? 在一个操作系统中,每个独立的执行的程序都可称为一个进程,也就是"正在运行的程序".如图所示: 线程概述: 如上所述,每个运行的程序 ...

  3. java多线程 —— 两种实际应用场景模拟

    最近做的偏向并发了,因为以后消息会众多,所以,jms等多个线程操作数据的时候,对共享变量,这些要很注意,以防止发生线程不安全的情况. (一) 先说说第一个,模拟对信息的发送和接收.场景是这样的: 就像 ...

  4. JAVA - 多线程 两种方法的比较

    一.继承Thread类 实现方法: (1).首先定义一个类去继承Thread父类,重写父类中的run()方法.在run()方法中加入具体的任务代码或处理逻辑.(2).直接创建一个ThreadDemo2 ...

  5. Java中两种实现多线程方式的对比分析

    本文转载自:http://www.linuxidc.com/Linux/2013-12/93690.htm#0-tsina-1-14812-397232819ff9a47a7b7e80a40613cf ...

  6. Java中有两种实现多线程的方式以及两种方式之间的区别

    看到一个面试题.问两种实现多线程的方法.没事去网上找了找答案. 网上流传很广的是一个网上售票系统讲解.转发过来.已经不知道原文到底是出自哪里了. Java中有两种实现多线程的方式.一是直接继承Thre ...

  7. java中两种类型变量

    Java中有两种类型的变量,一种是对象类型,另一种是基础类型(primitive type). 对象类型普遍采用引用的方式,比如 List a = new ArrayList(); List b = ...

  8. JAVA 中两种判断输入的是否是数字的方法__正则化_

    JAVA 中两种判断输入的是否是数字的方法 package t0806; import java.io.*; import java.util.regex.*; public class zhengz ...

  9. JavaScript 与 Java 是两种完全不同的语言,无论在概念还是设计上。

    JavaScript 与 Java 是两种完全不同的语言,无论在概念还是设计上. Java(由 Sun 发明)是更复杂的编程语言. ECMA-262 是 JavaScript 标准的官方名称. Jav ...

随机推荐

  1. IOS系统中使用zepto的live事件绑定不了的一个办法

    IOS系统中使用zepto的live事件绑定不了的一个办法: 对事件对象添加样式:cursor:pointer

  2. weblogic11g 节点管理器 nodemanager

    Weblogic 节点管理器  nodemanager 一.Weblogic  规划 : Server名称 端口 ip 备注 xyyadmin 7001 10.10.54.74 管理server ap ...

  3. ubuntu 默认 进入 命令行

    图形模式下,首先进入终端:1. 运行 sudo vi/etc/default/grub2. 找到 GRUB_CMDLINE_LINUX_DEFAULT=”quiet splash”3.改为 GRUB_ ...

  4. linux硬件驱动层

    1.make menuconfig scripts/kconfig/lxdialog/menubox.o: In function `print_buttons':menubox.c:(.text+0 ...

  5. C++ STL之priority_queue

    STL中的priority_queue(优先队列)是一种会按照自定义的一种方式(数据的优先级)来对队列中的数据进行动态的排序的容器,不同优先级的情况下,top()上永远是最高优先级的数据,其底层采用的 ...

  6. Using dblink in Postgres

    select contractid from tcim_s_enterprice EXCEPT select contractid from dblink ( 'host=172.16.51.25 p ...

  7. 浅析Java web程序之客户端和服务器端交互原理(转)

    转载自http://www.cnblogs.com/lys_013/archive/2012/05/05/2484561.html 1. 协议 a. TCP/IP整体构架概述 TCP/IP协议并不完全 ...

  8. CFileDialog使用总结

    http://blog.csdn.net/tianhai110/article/details/2055149 CFileDialog经常用,但经常忘,现归纳整理下,方便今后查询. 例子: CFile ...

  9. 使用Aspose.Cells组件生成Excel文件

    生成带表头的Excel文件,格式如下显示. 当然更复杂的一些也可以通过 合并单元格的方法 public void Merge(int firstRow, int firstColumn, int to ...

  10. Hadoop实战课程

    Hadoop生态系统配置Hadoop运行环境Hadoop系统架构HDFS分布式文件系统MapReduce分布式计算(MapReduce项目实战)使用脚本语言Pig(Pig项目实战)数据仓库工具Hive ...