zoukankan      html  css  js  c++  java
  • java: Thread 和 runnable线程类

    java: Thread 和 runnable线程类

    Java有2种实现线程的方法:Thread类,Runnable接口。(其实Thread本身就是Runnable的子类)

    Thread类,默认有run(), start()方法,继承Thread类,需要实现run方法

    Thread多线程,不能共享资源,保证数据的的统一(以商城商品数量,售票系统票的数量为例)

    例如:

    public class MyThread extends Thread {
    	private String name; // 定义name属性
    
    	public MyThread(String name) {
    		this.name = name;
    	}
    
    	public void run() {// 覆写run()方法
    		for (int i = 0; i < 50; i++) {// 表示循环10次
    			System.out.println("Thread运行:" + name + ",i = " + i);
    		}
    	}
    }
    

    实现1:

     此种方法说明:mt1线程执行完后,才能执行mt2线程

    public class ThreadDemo01 {
    	public static void main(String[] args) {
    		MyThread mt1 = new MyThread("线程A") ;
    		MyThread mt2 = new MyThread("线程B") ;
    		mt1.run() ;	// 调用线程体
    		mt2.run() ;	// 调用线程体
    	}
    }
    

      

    实现2:

    start()方法表示,调用系统底层方法,去抢占cpu资源,谁先抢到,谁就能优先得到cpu的调度

    public class ThreadDemo02 {
    	public static void main(String[] args) {
    		MyThread mt1 = new MyThread("线程A");
    		MyThread mt2 = new MyThread("线程B");
    		mt1.start(); // 调用线程体
    		mt2.start(); // 调用线程体
    
    	}
    
    }
    

      

    Runnable:

    public class MyThread implements Runnable { // 实现Runnable接口
    	private String name; // 定义name属性
    
    	public MyThread(String name) {
    		this.name = name;
    	}
    
    	public void run() {// 覆写run()方法
    		for (int i = 0; i < 50; i++) {// 表示循环10次
    			System.out.println("Thread运行:" + name + ",i = " + i);
    		}
    	}
    }
    

      

    实现子类:

    public class RunnableDemo01 {
    	public static void main(String[] args) {
    		MyThread mt1 = new MyThread("线程A");
    		MyThread mt2 = new MyThread("线程B");
    		new Thread(mt1).start(); // 调用线程体
    		new Thread(mt2).start(); // 调用线程体
    	}
    }
    

      

    推荐实现Runnable接口来使用多线程。

    使用Runnable能实现资源共享,以商城/售票系统为例,售卖票

    Thread例子:

    public class MyThread extends Thread {// 继承Thread类
    	private int ticket = 5; // 一共才5张票
    
    	public void run() {// 覆写run()方法
    		for (int i = 0; i < 50; i++) {// 表示循环10次
    			if (this.ticket > 0) {
    				System.out.println("卖票:ticket = " + this.ticket--);
    			}
    		}
    	}
    }
    

      

    实现子类:

    此种方法:其实票一共只有5张,但是三个线程,每个线程都能买到5张票,这样是不符合逻辑的

    public class ThreadTicket {
    	public static void main(String[] args) {
    		MyThread mt1 = new MyThread(); // 一个线程
    		MyThread mt2 = new MyThread(); // 一个线程
    		MyThread mt3 = new MyThread(); // 一个线程
    		mt1.start() ;	// 开始卖票
    		mt2.start() ;	// 开始卖票
    		mt3.start() ;	// 开始卖票
    	}
    
    }
    

      

    实现方法二:

    public class MyThread implements Runnable {// 实现Runnable接口
    	private int ticket = 5; // 一共才5张票
    
    	public void run() {// 覆写run()方法
    		for (int i = 0; i < 50; i++) {// 表示循环10次
    			if (this.ticket > 0) {
    				System.out.println("卖票:ticket = " + this.ticket--);
    			}
    		}
    	}
    }
    

      

    实现子类:

    此方法,能实现线程内的资源共享,不会卖出多余的票

    public static void main(String[] args) {
    		MyThread mt = new MyThread(); // 一个对象
    		new Thread(mt).start() ;// 一个线程开始卖票
    		new Thread(mt).start() ;//一个线程
    new Thread(mt).start() ; // 一个线程开始卖票
    }
    }

      

     

  • 相关阅读:
    HTML中ID与NAME的区别
    三层架构的学习感悟(二)
    linux svn安装和配置,不结合apache
    _dopostback回发后台的局限
    ASP.NET 服务器端控件响应客户端事件
    linux centos 下面httpd支持的svn 服务器端安装
    最简单的html tab选项卡
    VC2010 控件的事件窗口面板空白解决办法
    记录一次低版本手机h5页面不能进行跳转
    设计模式的理解
  • 原文地址:https://www.cnblogs.com/achengmu/p/6127463.html
Copyright © 2011-2022 走看看