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

    Java中线程的实现由两种方式:

    1. 继承Thread类; 2. 实现Runnable接口

    class MyThread extends Thread{
    	private String name;
    	public MyThread(String name) {
    		// TODO Auto-generated constructor stub
    		this.name = name;
    	}
    	
    	public void run(){
    		for(int i=0; i<10; i++){
    			System.out.println(name+"运行, i="+i);
    		}
    	}
    }
    
    public class ThreadDemo01 {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		MyThread mt1 = new MyThread("线程A");
    		MyThread mt2 = new MyThread("线程B");
    		
    		mt1.start();  //这里启动线程不是调用run方法
    		mt2.start();
    	}
    
    }
    

     为何启动线程必须通过start方法,而不能通过run方法呢? 

      原因在于线程的运行需要得到本机操作系统的支持。 用start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码。通过调用Thread类的start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到spu时间片,就开始执行run()方法,这里方法run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程随即终止。run()方法只是类的一个普通方法而已,如果直接调用Run方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码,这样就没有达到写线程的目的。

    通过实现runnable接口的方式如下:

    class MyThread implements Runnable{
    	private String name;
    	public MyThread(String name) {
    		// TODO Auto-generated constructor stub
    		this.name = name;
    	}
    	
    	public void run(){
    		for(int i=0; i<10; i++){
    			System.out.println(name+"运行, i="+i);
    		}
    	}
    }
    
    public class ThreadDemo01 {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		MyThread mt1 = new MyThread("线程A");
    		MyThread mt2 = new MyThread("线程B");
    		
    		Thread t1 = new Thread(mt1); //这里和继承Thread不太一样
    		Thread t2 = new Thread(mt2);
    		
    		t1.start();  //
    		t2.start();
    	}
    
    }
    

    Thread和runnable的子类都实现了runnable接口,之后将runnable 的子类实例放到了Thread类中,这种操作模式和代理模式类似。  

    如果一个类继承了Thread类,则不适合于多个线程共享资源,而实现了Runnable口的类就可以方便的实现资源的共享。

    class Thread1 extends Thread{
    	private int ticket = 5;
    	public void run(){
    		for(int i=0; i<100; i++){
    			if(ticket>0){
    				System.out.println("买票:ticket = "+ticket--);
    			}
    		}
    	}
    }
    
    public class ThreadDemo04 {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		Thread1 t1 = new Thread1();
    		Thread1 t2 = new Thread1();
    		Thread1 t3 = new Thread1();
    		t1.start();
    		t2.start();
    		t3.start();
    	}
    
    }
    

     

    class Thread2 implements Runnable{
    	private int ticket = 5;
    	public void run(){
    		for(int i=0; i<100; i++){
    			if(ticket>0){
    				System.out.println("买票: ticket = "+ticket--);
    			}
    		}
    	}
    }
    
    public class RunnableDemo02 {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		Thread2 t1 = new Thread2();
    		
    		
    		new Thread(t1).start();
    		new Thread(t1).start();
    		new Thread(t1).start();
    	}
    
    }
    

     

    实现Runnable接口相对于继承Thread类来说,有如下优势:

    1. 适合多个相同程序代码的线程去处理同一资源的情况。

    2. 可以避免由于Java的单继承特性带来的局限。

    3. 增强了程序的健壮性,代码能够被多个线程共享,代码与数据是独立的。 

     

    thread类中的主要方法

  • 相关阅读:
    openerp学习笔记 调用工作流
    openerp学习笔记 自定义小数精度(小数位数)
    openerp学习笔记 跟踪状态,记录日志,发送消息
    openerp学习笔记 计算字段、关联字段(7.0中非计算字段、关联字段只读时无法修改保存的问题暂未解决)
    openerp学习笔记 tree视图增加复选处理按钮
    openerp学习笔记 统计、分析、报表(过滤条件向导、分组报表、图形分析、比率计算、追加视图排序)
    openerp学习笔记 视图样式(表格行颜色、按钮,字段只读、隐藏,按钮状态、类型、图标、权限,group边距,聚合[合计、平均],样式)
    openerp学习笔记 计划动作、计划执行(维护计划)
    银行前置以及银行核心系统
    什么是报文
  • 原文地址:https://www.cnblogs.com/aituming/p/4777928.html
Copyright © 2011-2022 走看看