创建多线程的四种方式

Posted 学僧ceo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了创建多线程的四种方式相关的知识,希望对你有一定的参考价值。

注:主要记录创建的步骤,代码仅供参考

方式一:继承Thread

/**
 * 创建多线程方式一:继承Thread
 * 1:创建一个继承于Thread类的子类
 * 2:重写Thread类的run()
 * 3:创建Thread类的子类对象
 * 4:通过此对象调用start()
 */
public class ThreadTestOne 
    public static void main(String[] args) 
        MyThread myThread1 = new MyThread();
        MyThread myThread2 = new MyThread();
        myThread1.start();
        myThread2.start();
        for (int i = 0; i < 100; i++) 
            System.out.println(Thread.currentThread().getName() + ":" + i);
        
    


class MyThread extends Thread 
    @Override
    public void run() 
        for (int i = 1; i <= 100; i++) 
            if (i % 2 == 0) 
                System.out.println(Thread.currentThread().getName() + ":" + i);
            
        
    

方式二:实现Runnable接口

/**
 * 创建多线程的方式二:实现Runnable接口
 * 1:创建一个实现了Runnable接口的类
 * 2:实现类去实现Runnable中的抽象方法:run()
 * 3:创建实现类的对象
 * 4:将此对象作为参数传递到Thread类的构造器中,创建Thread类的对象
 * 5:通过Thread类的对象调用start()
 */
public class ThreadTestTwo 
    public static void main(String[] args) 
        MThread mThread = new MThread();
        Thread thread = new Thread(mThread);
        thread.setName("进程一");
        thread.start();
        Thread thread2 = new Thread(mThread);
        thread2.setName("进程二");
        thread2.start();
    


class MThread implements Runnable 
    @Override
    public void run() 
        for (int i = 0; i < 100; i++) 
            if (i % 2 == 0) 
                System.out.println(Thread.currentThread().getName() + ":" + i);
            
        
    

方式三:实现Callable接口

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
 * 多线程创建方式之三:实现Callable接口。jdk5.0新增
 * 1:创建一个实现Callable的实现类
 * 2:实现call方法,将此线程需要执行的操作声明在call方法中
 * 3:创建Callable接口实现类的对象
 * 4:将此Callable接口实现类的对象作为参数传递到FutureTask构造器中,创建FutureTask的对象
 * 5:将FutureTask的对象作为参数传递到Thread类的构造器中,创建Thread对象并调用start()
 * 6:使用FutureTask的get方法获取Callable中call方法的返回值(可不获取)
 */
public class ThreadTestThree 
    public static void main(String[] args) throws ExecutionException, InterruptedException 
        ThirdThread thirdThread = new ThirdThread();
        FutureTask futureTask = new FutureTask(thirdThread);
        Thread thread = new Thread(futureTask);
        thread.setName("线程一");
        thread.start();
        for (int i = 1; i <= 100; i++) 
            if (i % 2 != 0) 
                System.out.println(Thread.currentThread().getName() + ":" + i);
            
        

        Object o = futureTask.get();
        System.out.println(Thread.currentThread().getName() + ": 线程一总和为" + o);
    


class ThirdThread implements Callable 
    @Override
    public Object call() throws Exception 
        int sum = 0;
        for (int i = 1; i <= 100; i++) 
            if (i % 2 == 0) 
                System.out.println(Thread.currentThread().getName() + ":" + i);
                sum += i;
            
        
        return sum;
    

方式四:线程池

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

/**
 * 创建多线程方式之四:线程池
 * 1:提供线程池
 * 2:执行指定的线程操作,需提供Runnable或Callable的实现类对象
 * 3:关闭线程池
 */
public class ThreadTestFour 
    public static void main(String[] args) 
        ExecutorService executorService = Executors.newFixedThreadPool(10);
        //获取接口的实现类型
        //System.out.println(executorService.getClass());
        ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor) executorService;
        //设置线程池的属性
        threadPoolExecutor.setCorePoolSize(12);
        threadPoolExecutor.setMaximumPoolSize(10);
        /**
         * executorService.execute(Runnable commd);
         * executorService.submit(Callable commd):可用FutureTask获取结果;
         */
        executorService.submit(new ThreadTest());
        executorService.submit(new ThreadTest());
        executorService.shutdown();
    


class ThreadTest implements Callable 
    @Override
    public Object call() throws Exception 
        int sum = 0;
        for (int i = 1; i <= 100; i++) 
            if (i % 2 == 0) 
                System.out.println(Thread.currentThread().getName() + ":" + i);
                sum += i;
            
        
        return sum;
    

 例:三个窗口同时售票

public class ThreadRunnableLearn 
    public static void main(String[] args) 
        RunnableThread runnableThread = new RunnableThread();
        Thread thread1 = new Thread(runnableThread);
        thread1.setName("窗口一");
        Thread thread2 = new Thread(runnableThread);
        thread2.setName("窗口二");
        Thread thread3 = new Thread(runnableThread);
        thread3.setName("窗口三");
        thread1.start();
        thread2.start();
        thread3.start();
    


class RunnableThread implements Runnable 
    private int ticket = 100;

    @Override
    public void run() 
        while (true) 
            /**
             * 解决线程安全问题有三种方式:
             * 一:同步代码块(如例),RunnableThread类也是一个对象,而且只会加载一次,所以是唯一的
             * 二:同步方法【private synchronized void 方法名() 】当操作共享数据的代码在一个方法中,则可使用
             * 当同步方法为非静态:则默认同步监视器是this
             * 当同步方法为静态: 则默认同步监视器是该方法属于的类 xxx.class
             * 三:ReentrantLock
             */
            synchronized (RunnableThread.class) 
                if (ticket > 0) 
                    try 
                        Thread.sleep(100);
                     catch (InterruptedException e) 
                        e.printStackTrace();
                    
                    System.out.println(Thread.currentThread().getName() + "售票,票号为" + ticket);
                    ticket--;
                else 
                    break;
                
            
        
    

 


以上是关于创建多线程的四种方式的主要内容,如果未能解决你的问题,请参考以下文章

Java多线程的四种实现方式

实现多线程的四种方式

Java实现多线程的四种方式

JAVA多线程实现的四种方式

Java多线程实现的四种方式

Java多线程实现的四种方式