zoukankan      html  css  js  c++  java
  • java多线程编程

     Java中实现多线程有两种方法:继承Thread类、实现Runnable接口,在程序开发中只要是多线程,肯定永远以实现Runnable接口为主,因为实现Runnable接口相比继承Thread类有如下优势:

        1、可以避免由于Java的单继承特性而带来的局限;

        2、增强程序的健壮性,代码能够被多个线程共享,代码与数据是独立的;

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

    通过继承Thread来创建线程

      创建一个线程的第二种方法是创建一个新的类,该类继承 Thread 类,然后创建一个该类的实例。

      继承类必须重写 run() 方法,该方法是新线程的入口点。它也必须调用 start() 方法才能执行。

      该方法尽管被列为一种多线程实现方式,但是本质上也是实现了 Runnable 接口的一个实例。

     1 class ThreadDemo extends Thread {
     2    private Thread t;
     3    private String threadName;
     4    
     5    ThreadDemo( String name) {
     6       threadName = name;
     7       System.out.println("Creating " +  threadName );
     8    }
     9    
    10    public void run() {
    11       System.out.println("Running " +  threadName );
    12       try {
    13          for(int i = 4; i > 0; i--) {
    14             System.out.println("Thread: " + threadName + ", " + i);
    15             // 让线程睡醒一会
    16             Thread.sleep(50);
    17          }
    18       }catch (InterruptedException e) {
    19          System.out.println("Thread " +  threadName + " interrupted.");
    20       }
    21       System.out.println("Thread " +  threadName + " exiting.");
    22    }
    23    
    24    public void start () {
    25       System.out.println("Starting " +  threadName );
    26       if (t == null) {
    27          t = new Thread (this, threadName);
    28          t.start ();
    29       }
    30    }
    31 }
    32  
    33 public class TestThread {
    34  
    35    public static void main(String args[]) {
    36       ThreadDemo T1 = new ThreadDemo( "Thread-1");
    37       T1.start();
    38       
    39       ThreadDemo T2 = new ThreadDemo( "Thread-2");
    40       T2.start();
    41    }   
    42 }

    thread线程运行结果:

    Creating Thread-1
    Starting Thread-1
    Creating Thread-2
    Starting Thread-2
    Running Thread-1
    Thread: Thread-1, 4
    Running Thread-2
    Thread: Thread-2, 4
    Thread: Thread-1, 3
    Thread: Thread-2, 3
    Thread: Thread-1, 2
    Thread: Thread-2, 2
    Thread: Thread-1, 1
    Thread: Thread-2, 1
    Thread Thread-1 exiting.
    Thread Thread-2 exiting.

    通过实现 Runnable 接口来创建线程

    创建一个线程,最简单的方法是创建一个实现 Runnable 接口的类。

    为了实现 Runnable,一个类只需要执行一个方法调用 run(),声明如下:

    public void run()

    你可以重写该方法,重要的是理解的 run() 可以调用其他方法,使用其他类,并声明变量,就像主线程一样。

    在创建一个实现 Runnable 接口的类之后,你可以在类中实例化一个线程对象。

    Thread 定义了几个构造方法,下面的这个是我们经常使用的:

    Thread(Runnable threadOb,String threadName);

    这里,threadOb 是一个实现 Runnable 接口的类的实例,并且 threadName 指定新线程的名字。

    新线程创建之后,你调用它的 start() 方法它才会运行。

    void start();

    下面是一个创建线程并开始让它执行的实例:

    class RunnableDemo implements Runnable {
       private Thread t;
       private String threadName;
       
       RunnableDemo( String name) {
          threadName = name;
          System.out.println("Creating " +  threadName );
       }
       
       public void run() {
          System.out.println("Running " +  threadName );
          try {
             for(int i = 4; i > 0; i--) {
                System.out.println("Thread: " + threadName + ", " + i);
                // 让线程睡眠一会
                Thread.sleep(50);
             }
          }catch (InterruptedException e) {
             System.out.println("Thread " +  threadName + " interrupted.");
          }
          System.out.println("Thread " +  threadName + " exiting.");
       }
       
       public void start () {
          System.out.println("Starting " +  threadName );
          if (t == null) {
             t = new Thread (this, threadName);
             t.start ();
          }
       }
    }
     
    public class TestThread {
     
       public static void main(String args[]) {
          RunnableDemo R1 = new RunnableDemo( "Thread-1");
          R1.start();
          
          RunnableDemo R2 = new RunnableDemo( "Thread-2");
          R2.start();
       }   
    }
  • 相关阅读:
    select、poll、epoll之间的区别总结[整理]
    IO多路复用之epoll总结
    IO多路复用之select总结
    recv send 阻塞和非阻塞
    undefined reference to `pthread_create' collect2: ld returned 1 exit status
    网络编程 recv()函数
    strlen("汉字")的值是多少
    PPI协议详解 ppi通讯协议 ppi通信协议 vb与ppi协议通讯
    poj1651 Multiplication Puzzle
    poj2240 Arbitrage
  • 原文地址:https://www.cnblogs.com/lt132024/p/6438586.html
Copyright © 2011-2022 走看看