• 线程的实现


    线程的实现

    要实现多线程有两种方式,一种是继承thread类(要重写run()方法),一种是实现Runnable接口。

    1、实现方式一 (用的较少)

    package com.erequan.thread;

     

     

    public class MyThread extends Thread {

    private String name null;

     

    public MyThread(String name) {

    this.name name;

    }

     

    public void run()  //重写run方法

    for (int 0; 50; i++) {

    System.out.println("Thread运行:" name ", " i);

    }

    }

    }

     

    package com.erequan.thread;

     

    public class TestThread {

     

     

    public static void main(String[] args) {

    MyThread thread1 new MyThread("线程A");

    MyThread thread2 new MyThread("线程B");

     

    // thread1.run(); //开始线程

    // thread2.run(); //开始线程

    thread1.start();  //开始线程

    thread2.start();

    }

     

    }

     

     

     

    2、实现方式二

    public interface Runnable {

    Void run();

    }

     

    package com.erequan.runnable;

     

     

    public class MyRunnable implements Runnable {

     

    private String name null;

     

    public MyRunnable(String name) {

    this.name name;

    }

     

    public void run()  //重写run方法

    for (int 0; 50; i++) {

    System.out.println("Thread运行:" name ", " i);

    }

    }

    }

     

    package com.erequan.runnable;

     

    public class TestRuuable {

     

    public static void main(String[] args) {

    MyRunnable myRunnableA new MyRunnable("线程A");

    MyRunnable myRunnableB new MyRunnable("线程B");

    // Thread(ThreadGroup, Runnable, String)

    new Thread(myRunnableA).start();  //启动线程

    new Thread(myRunnableB).start();

    }

    }

     

    两种实现方法的区别,在开发中一般都是用方法二。好处有:避免单继承的局限性。适用于多线程的共享。

     

    如下假设一个购票系统:

    thread方式实现:

     

    package com.erequan.ticket;

     

    public class BuyTiacet extends Thread {

    int ticketNum 10;  //假设一共有10张票

     

    public void run() {

    for (int 0; 15; i++) {

    if (ticketNum 0) {

    System.out.println("买了" ticketNum "张票");

    ticketNum--;

    }

    }

    }

    }

     

    package com.erequan.ticket;

     

    public class TestTicket {

     

     

    public static void main(String[] args) {

    //创建5个不同的线程

    BuyTiacet buyTicketA new BuyTiacet();  //

    BuyTiacet buyTicketB new BuyTiacet();

    BuyTiacet buyTicketC new BuyTiacet();

    BuyTiacet buyTicketD new BuyTiacet();

    BuyTiacet buyTicketE new BuyTiacet();

    BuyTiacet buyTicketF new BuyTiacet();

     

    //开始线程

    buyTicketA.start();

    // buyTicketA.start();

    // buyTicketA.start();

    // buyTicketA.start();

    // buyTicketA.start();

    // buyTicketA.start();

    buyTicketB.start();

    buyTicketC.start();

    buyTicketD.start();

    buyTicketE.start();

    buyTicketF.start();

    }

    }

     

    结果是每个线程都买了相同多的票数,并不是资源的共享。即每个线程各不相关,各自有各自的线程。并且不能有相同的两个线程在执行,否则会报错!!

     

    Runnable实现

     

    package com.erequan.ticket;

     

    public class RunnableTicket implements Runnable {

    int ticketNum 4;  //假设一共有10张票

    public void run() {

    for (int 0; 50; i++) {

    if (ticketNum 0) {

    System.out.println("买了" ticketNum "张票");

    ticketNum--;

    }

    }

    }

    }

     

     

     

    package com.erequan.ticket;

     

    public class TestTicket {

     

     

    public static void main(String[] args) {

    //Runnable方式

    private static void RunnableTest() {

    RunnableTicket runnableTicketA new RunnableTicket();

     

    new Thread(runnableTicketA).start();  //线程 A

    new Thread(runnableTicketA).start();  //线程 B

    new Thread(runnableTicketA).start();  //线程 C

    new Thread(runnableTicketA).start();  //线程 D

    new Thread(runnableTicketA).start();  //线程 E

     

    }

     

    }

     

    实现了资源的共享!!

     

    但是在不同版本的jdk下得到的结果不同,可以查看帮助文档的run()方法!!

    在线文档

    http://online.chinaitpower.com/

     

    Jdk1.5

    public synchronized void start() {

    if (started)

    throw new IllegalThreadStateException();

    started true;

    group.add(this);

    start0();

    }

    private native void start0();

     

    public void run() {

    if (target != null{

    target.run();

    }

     

    Jdk1.4

    Public  synchronized  native  void start();

     

    Public  void  run() {

    if(target != null{

    target.run();

    }

    }

     


    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    JAVA基础知识
    php中数据库服务器连接类库文件的编写
    面向对象三大特征之 封装
    composer 报错处理
    【Linux】ssh免密登录
    【天天数据结构和算法】PHP中trie数据结构的使用场景和代码实例
    【天天数据结构和算法】PHP实现二叉搜索树
    【天天数据结构和算法】PHP实现二分查找的两种方法
    【Linux】CentOS 7下yum成功安装 MySQL 5.7
    【实例】除法转移位运算
  • 原文地址:https://www.cnblogs.com/ubuntuvim/p/4796565.html
Copyright © 2020-2023  润新知