zoukankan      html  css  js  c++  java
  • java实现多线程的方法

    一、实现方法

    1、继承Thread类

    2、实现Runnable接口

    (一)继承Thread类

    对于直接继承Thread的类来说,代码大致框架是:

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

    先看一个错误的例子:

     1 /**
     2  * 继承Thread类,直接调用run方法
     3  */
     4 class hello extends Thread {
     5     private String name;
     6 
     7     public hello() {
     8     }
     9 
    10     public hello(String name) {
    11         this.name = name;
    12     }
    13 
    14     public void run() {
    15         for (int i = 0; i < 5; i++) {
    16             System.out.println(name + "运行     " + i);
    17         }
    18     }
    19 
    20     public static void main(String[] args) {
    21         hello h1 = new hello("A");
    22         hello h2 = new hello("B");
    23         h1.run();
    24         h2.run();
    25     }
    26 }

     我们会发现这些都是顺序执行的,说明我们的调用方法不对,应该调用的是start()方法。

    将main函数改为以下代码

    public static void main(String[] args) {
            hello h1 = new hello("A");
            hello h2 = new hello("B");
            h1.start();
            h2.start();
        }

     运行的结果可能为:

    A运行 0
    B运行 0
    A运行 1
    B运行 1
    A运行 2
    B运行 2
    A运行 3
    A运行 4
    B运行 3
    B运行 4

    因为需要用到CPU的资源,所以每次的运行结果基本是都不一样的。

    注意:虽然我们在这里调用的是start()方法,但是实际上调用的还是run()方法的主体。

    那么:为什么我们不能直接调用run()方法呢?

    我的理解是:线程的运行需要本地操作系统的支持。

    (二)实现Runnable接口

    代码大致框架如下:

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

    先看个例子(注意和继承Thread ,main函数的不同):

     1 /**
     2  * 调用Runnable方法
     3  */
     4 class hello implements Runnable {
     5     private String name;
     6 
     7     public hello() {
     8     }
     9 
    10     public hello(String name) {
    11         this.name = name;
    12     }
    13 
    14     public void run() {
    15         for (int i = 0; i < 5; i++) {
    16             System.out.println(name + "运行     " + i);
    17         }
    18     }
    19 
    20     public static void main(String[] args) {
    21         hello h1 = new hello("A");
    22         Thread t1 = new Thread(h1);
    23         hello h2 = new hello("B");
    24         Thread t2 = new Thread(h2);
    25         t1.start();
    26         t2.start();
    27     }
    28 }

    可能的运行结果为:

    A运行 0
    B运行 0
    B运行 1
    B运行 2
    B运行 3
    B运行 4
    A运行 1
    A运行 2
    A运行 3
    A运行 4

    Thread和Runnable的区别:

    如果一个类继承Thread,则不适合资源共享。但是如果实现了Runable接口的话,则很容易的实现资源共享。

    总结一下:

    实现Runnable接口比继承Thread类所具有的优势:

    1)适合多个相同的程序代码的线程去处理同一个资源

    2)可以避免java中的单继承的限制

    3)增加程序的健壮性,代码可以被多个线程共享,代码和数据独立。

    所以,本人建议大家尽量实现接口。

  • 相关阅读:
    基于node.js+socket.io+html5实现的斗地主游戏(1)概述
    [javascript]switchTab:仿腾讯首页Tab栏切换js插件
    [js]利用闭包向post回调函数传参数
    [CSS]利用伪元素实现一些特殊图形 from baidu校招
    [javascript]模块化&命名污染—from 编程精解
    [随手记]2014前端面试题解
    [IE bug] ajax请求 304解决方案
    [java]基于UDP的Socket通信Demo
    [JQuery]ScrollMe滚动特效插件
    java.lang.OutOfMemoryError及解决方案
  • 原文地址:https://www.cnblogs.com/lnluckybamboo/p/3951067.html
Copyright © 2011-2022 走看看