21 - 线程

1. 创建线程的方式:

    方式1,继承Thread线程类
    步骤
        1,自定义类继承Thread类
        2,在自定义类中重写Thread类的run方法
        3,创建自定义类对象(线程对象)
        4,调用start方法,启动线程,通过JVM,调用线程中的run方法


    方式2,实现Runnable接口
    步骤
        1,    创建线程任务类 实现Runnable接口
        2,    在线程任务类中 重写接口中的run方法
        3,    创建线程任务类对象
        4,    创建线程对象,把线程任务类对象作为Thread类构造方法的参数使用
        5,    调用start方法,启动线程,通过JVM,调用线程任务类中的run方法

2. Thread

3. 线程创建

4. 线程池

package cn.itcast.demo;
/*
 *  程序中的主线程
 */
public class Demo {
    public static void main(String[] args) {
        System.out.println(0/0);
        function();
        System.out.println(Math.abs(-9));
    }
    
    public static void function(){
        for(int i = 0 ; i < 10000;i++){
            System.out.println(i);
        }
    }
}
package cn.itcast.demo;
/*
 *  定义子类,继承Thread 
 *  重写方法run 
 */
public class SubThread  extends Thread{
    public void run(){
        for(int i = 0; i < 50;i++){
            System.out.println("run..."+i);
        }
    }
}
package cn.itcast.demo;
/*
 * 创建和启动一个线程
 *   创建Thread子类对象
 *   子类对象调用方法start()
 *      让线程程序执行,JVM调用线程中的run
 */
public class ThreadDemo {
    public static void main(String[] args) {
        SubThread st = new SubThread();
        SubThread st1 = new SubThread();
        st.start();
        st1.start();
        for(int i = 0; i < 50;i++){
            System.out.println("main..."+i);
        }
    }
}
package cn.itcast.demo1;
/*
 *  获取线程名字,父类Thread方法
 *    String getName()
 */
public class NameThread extends Thread{
    
    public NameThread(){
        super("小强");
    }
    
    public void run(){
        System.out.println(getName());
    }
}
package cn.itcast.demo1;
/*
 *  每个线程,都有自己的名字
 *  运行方法main线程,名字就是"main"
 *  其他新键的线程也有名字,默认 "Thread-0","Thread-1"
 *  
 *  JVM开启主线程,运行方法main,主线程也是线程,是线程必然就是
 *  Thread类对象
 *  Thread类中,静态方法
 *   static Thread currentThread()返回正在执行的线程对象
 */
public class ThreadDemo {
    public static void main(String[] args) {
        NameThread nt = new NameThread();
        nt.setName("旺财");
        nt.start();
        
        /*Thread t =Thread.currentThread();
        System.out.println(t.getName());*/
        System.out.println(Thread.currentThread().getName());


    }
}

====================

package cn.itcast.demo2;

public class SleepThread extends Thread{
    public void run(){
        for(int i = 0 ; i < 5 ;i++){
            try{
                Thread.sleep(500);
            }catch(Exception ex){
                
            }
            System.out.println(i);
        }
    }
}
package cn.itcast.demo2;

public class ThreadDemo {
    public static void main(String[] args) throws Exception{
        /*for(int i = 0 ; i < 5 ;i++){
            Thread.sleep(50);
            System.out.println(i);
        }*/
        
        new SleepThread().start();
    }
}
package cn.itcast.demo3;
/*
 *  实现线程成功的另一个方式,接口实现
 *  实现接口Runnable,重写run方法
 */
public class SubRunnable implements Runnable{
    public void run(){
        for(int i = 0 ; i < 50; i++){
            System.out.println("run..."+i);
        }
    }
}
package cn.itcast.demo3;
/*
 *  实现接口方式的线程
 *    创建Thread类对象,构造方法中,传递Runnable接口实现类
 *    调用Thread类方法start()
 */
public class ThreadDemo {
    public static void main(String[] args) {
        SubRunnable sr = new SubRunnable();
        Thread t = new Thread(sr);
        t.start();
        for(int i = 0 ; i < 50; i++){
            System.out.println("main..."+i);
        }
    }
}
package cn.itcast.demo4;
/*
 *  使用匿名内部类,实现多线程程序
 *  前提: 继承或者接口实现
 *  new 父类或者接口(){
 *     重写抽象方法
 *  }
 */
public class ThreadDemo {
    public static void main(String[] args) {
        //继承方式  XXX extends Thread{ public void run(){}}
        new Thread(){
            public void run(){
                System.out.println("!!!");
            }
        }.start();
        
        //实现接口方式  XXX implements Runnable{ public void run(){}}
        
        Runnable r = new Runnable(){
            public void run(){
                System.out.println("###");
            }
        };
        new Thread(r).start();
        
        
        new Thread(new Runnable(){
            public void run(){
                System.out.println("@@@");
            }
        }).start();
        
    }
}

线程池

package cn.itcast.demo5;
/*
 * Callable 接口的实现类,作为线程提交任务出现
 * 使用方法返回值
 */

import java.util.concurrent.Callable;

public class ThreadPoolCallable implements Callable<String>{
    public String call(){
        return "abc";
    }
}
package cn.itcast.demo5;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/*
 *  JDK1.5新特性,实现线程池程序
 *  使用工厂类 Executors中的静态方法创建线程对象,指定线程的个数
 *   static ExecutorService newFixedThreadPool(int 个数) 返回线程池对象
 *   返回的是ExecutorService接口的实现类 (线程池对象)
 *   
 *   接口实现类对象,调用方法submit (Ruunable r) 提交线程执行任务
 *          
 */
public class ThreadPoolDemo {
    public static void main(String[] args) {
        //调用工厂类的静态方法,创建线程池对象
        //返回线程池对象,是返回的接口
        ExecutorService es = Executors.newFixedThreadPool(2);
        //调用接口实现类对象es中的方法submit提交线程任务
        //将Runnable接口实现类对象,传递
        es.submit(new ThreadPoolRunnable());
        es.submit(new ThreadPoolRunnable());
        es.submit(new ThreadPoolRunnable());
    
    }
}
package cn.itcast.demo5;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

/*
 *  实现线程程序的第三个方式,实现Callable接口方式
 *  实现步骤
 *    工厂类 Executors静态方法newFixedThreadPool方法,创建线程池对象
 *    线程池对象ExecutorService接口实现类,调用方法submit提交线程任务
 *    submit(Callable c)
 */
public class ThreadPoolDemo1 {
    public static void main(String[] args)throws Exception {
        ExecutorService es = Executors.newFixedThreadPool(2);
        //提交线程任务的方法submit方法返回 Future接口的实现类
        Future<String> f = es.submit(new ThreadPoolCallable());
        String s = f.get();
        System.out.println(s);
    }
}
package cn.itcast.demo5;

public class ThreadPoolRunnable implements Runnable {
    public void run(){
        System.out.println(Thread.currentThread().getName()+" 线程提交任务");
    }
}
package cn.itcast.demo6;

import java.util.concurrent.Callable;

public class GetSumCallable implements Callable<Integer>{
    private int a;
    public GetSumCallable(int a){
        this.a=a;
    }
    
    public Integer call(){
        int sum = 0 ;
        for(int i = 1 ; i <=a ; i++){
            sum = sum + i ;
        }
        return sum;
    }
}
package cn.itcast.demo6;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

/*
 * 使用多线程技术,求和
 * 两个线程,1个线程计算1+100,另一个线程计算1+200的和
 * 多线程的异步计算
 */
public class ThreadPoolDemo {
    public static void main(String[] args)throws Exception {
        ExecutorService es = Executors.newFixedThreadPool(2);
        Future<Integer> f1 =es.submit(new GetSumCallable(100));
        Future<Integer> f2 =es.submit(new GetSumCallable(200));
        System.out.println(f1.get());
        System.out.println(f2.get());
        es.shutdown();
    }
}
posted @ 2019-07-12 16:13  Alice的小屋  阅读(124)  评论(0编辑  收藏  举报