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

    java中要想实现多线程,有两种手段,一种是继续Thread类另外一种是实现Runable接口.(其实准确来讲,应该有三种,还有一种是实现Callable接口,并与Future、线程池结合使用,此文这里不讲这个。

    第一种创建线程的方法:继承Thread类 

    package com.multithread.learning;  
    /** 
     *@functon 多线程学习 
     *@author 林炳文 
     *@time 2015.3.9 
     */  
    class Thread1 extends Thread{  
        private String name;  
        public Thread1(String name) {  
           this.name=name;  
        }  
        public void run() {  
            for (int i = 0; i < 5; i++) {  
                System.out.println(name + "运行  :  " + i);  
                try {  
                    sleep((int) Math.random() * 10);  
                } catch (InterruptedException e) {  
                    e.printStackTrace();  
                }  
            }  
             
        }  
    }  
    public class Main {  
      
        public static void main(String[] args) {  
            Thread1 mTh1=new Thread1("A");  
            Thread1 mTh2=new Thread1("B");  
            mTh1.start();  
            mTh2.start();  
      
        }  
      
    }  
    
    • Thread.currentThread()静态函数获得代码当前执行时对应的那个线程对象。得到当前线程对象后,调用getName()方法,取出当前线程的名称字符串。

    • 以上代码1中,没有直接调用TestThread类对象的run方法,而是调用了TestThread类对象从Thread类继承来的start方法。

    方法步骤总结: 
    (1)定义一个类(如PrimeThread)继承Thread; 
    (2)重写Thread类中的run方法,将需要被多线程执行的代码存储到该run方法当中。 
    (3)建立Thread类的子类创建线程对象。 
    (4)直接调用子类从Thread类继承的start方法,开启一个线程(调用该线程的run方法)。

    第二种创建线程的方法:实现Runable接口

    /** 
     *@functon 多线程学习 
     *@author 林炳文 
     *@time 2015.3.9 
     */  
    package com.multithread.runnable;  
    class Thread2 implements Runnable{  
        private String name;  
      
        public Thread2(String name) {  
            this.name=name;  
        }  
      
        @Override  
        public void run() {  
              for (int i = 0; i < 5; i++) {  
                    System.out.println(name + "运行  :  " + i);  
                    try {  
                        Thread.sleep((int) Math.random() * 10);  
                    } catch (InterruptedException e) {  
                        e.printStackTrace();  
                    }  
                }  
              
        }  
          
    }  
    public class Main {  
      
        public static void main(String[] args) {  
            new Thread(new Thread2("C")).start();  
            new Thread(new Thread2("D")).start();  
        }  
      
    }  
      • Thread类有一个Thread(Runnable target)构造方法,在Runable接口类中只有一个run()方法。当使用Thread(Runnable target)方法创建线程对象时,需要为该方法传递一个实现 Runnable接口的对象,这样创建的线程将调用那个实现了Runnable接口类对象中的run()方法作为其运行代码,而不再是调用Thread类中的run方法了。

      • 方法步骤总结: 
        (1)定义一个类(如PrimeRun)实现Runnable接口,覆盖Runnable接口中的run方法,将线程要运行的代码存放在该run方法中; 
        (2)通过Thread类建立线程对象,将Runnable接口的子类实例对象作为实际参数传递给Thread类的构造方法。

      • 两种方式区别:

        (1)继承Thread: 线程代码存放Thread子类run方法中,且该run方法被调用。 
        (2)实现Runnable:线程代码存在实现了Runnable类接口的对象的run方法中,且该run方法被调用。

              要实现多线程,就得编写一个继承了Thread类的子类,要将一段代码在一个新的线程上运行,该代码应该在一个类的run函数中,并且run函数所在的类是Thread类的子类。从JDK文档可知,Thread类的子类应该覆盖run方法(函数)。

              启动一个新的线程,不是直接调用Thread子类的对象的run方法,而是调用Thread子类对象的start方法,start方法是从Thread类中继承的方法,Thread类对象的start方法将产生一个新的线程,并在该线程上运行该Thread类对象中的run方法。根据面向对象的多态性可知,在该线程上实际运行的是我们编写的那个类(Thread的子类)对象中的run方法。

              由于线程的代码段在run方法中,那么该方法执行完以后,线程也就相应的结束了,因而可以通过控制run方法中的循环条件来控制线程的终止。这个问题就是“线程生命的控制”问题了。

  • 相关阅读:
    六:观察者模式
    聊一聊如何接入支付宝
    每天学点SpringCloud(八):使用Apollo做配置中心
    每天学点SpringCloud(七):路由器和过滤器-Zuul
    每天学点SpringCloud(六):Hystrix使用
    每天学点SpringCloud(五):如何使用高可用的Eureka
    每天学点SpringCloud(四):Feign的使用及自定义配置
    每天学点SpringCloud(三):自定义Eureka集群负载均衡策略
    每天学点SpringCloud(二):服务注册与发现Eureka
    每天学点SpringCloud(一):使用SpringBoot2.0.3整合SpringCloud
  • 原文地址:https://www.cnblogs.com/zl181015/p/9429466.html
Copyright © 2011-2022 走看看