多线程:线程的创建

1.多线程的创建(1) 继承Thread类的方式

1.创建一个继承于Thread的子类,2.重写Thread中的run方法3.将需要进行操作的步骤写在run方法中4.在父类中创建子类对象,5.通过此对象调用start方法

问题:不能用过对象.run的方式启动多线程。若在启动一个多线程,需要再创建一个子类对象,然后调star。

public class ThreadTest {
    public static void main(String[] args) {
        MyThread t1 = new MyThread();
        t1.start();

    }
}

public class MyThread extends Thread{
    @Override
    public void run() {
        for (int i = 0; i <= 100; i++) {
            if (i%2==0){
                System.out.println(i);
            }

        }
    }
}

Thread中的常用方法:

1.start():启动当前线程;调用当前线程的run

2.run():  通常需要重写Thread类中的此方法,将创建的线程要执行的操作声明在此方法中;

3.currentThread():静态方法,返回执行当前代码的线程

4.getName():获取当前线程的名字

5.fetName():设置带当前线程的名字

6.yield():释放当前cpu中的执行权

7.join():在线程a中调用线程b的join(),此时线程a就进去阻塞状态,知道线程b完全执行完 ,线程a才结束阻塞状态

8.stop():已经过时,当执行此方法时,强制结束当前线程

9.sleep(long millitime):让当前线程”睡眠“指定的毫秒,在指定的毫秒时间内,当前线程是阻塞状态

10.isAlive():判断当前线程是否存活

 

2.多线程的创建(2) 实现Runnable接口的方式

1.创建一个实现的Runnable接口的类

2.实现类去实现Runnable中的抽象方法:run()

3.创建实现类的对象

4.将此对象作为参数传递到Threas类的构造器中,创建Thread类的对象

5.通过Thread类的对象调用start方法

package com.huzheng.java;

public class ThreadTest1 {
    public static void main(String[] args) {
        Mthread mthread = new Mthread(); //创建实现类的对象
        Thread thread = new Thread(mthread); //将此对象作为参数传递到Threas类的构造器中,创建Thread类的对象
        thread.setName("线程一");
        thread.start();  //通过Thread类的对象调用start方法
    }


}
class Mthread implements Runnable{ //创建一个实现的Runnable接口的类

    @Override
    public void run() {      //实现类去实现Runnable中的抽象方法:run()
        for (int i = 0; i < 100; i++) {
            if(i%2==0){
                System.out.println(Thread.currentThread().getName()+":"+i);
            }
        }
    }
}

开发中优先选择第二种方法

相同点是都需要重写run(),将线程要执行的逻辑声明在()中

 

创建多线程的第三种方法:实现callable接口

package java1;

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

public class ThreadNew {
    public static void main(String[] args)   {
        NumThread numThread = new NumThread();  //创建callable接口实现类的对象
        FutureTask futureTask = new FutureTask(numThread);  //将此callable实现类的对象作为参数传递到FutureTask中
        new Thread(futureTask).start();  //将futureTask的对象作为参数传递到Thread类的构造器中,创建Thread对象,并调用star
        try {
            Object sum = futureTask.get(); //获取callable中call方法的返回值
            System.out.println(sum);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }

    }
}
class NumThread implements Callable{ //1.创建一个实现Callable的实现类

    @Override
    public Object call() throws Exception { //实现call方法,将此线程需要执行的操作声明在call方法中,call方法有返回值
        int sum=0;
        for (int i = 0; i <= 100; i++) {
            if (i%2==0){
                System.out.println(i);
                sum +=i;
            }
        }
        return sum;
    }

}

如何理解实现callable接口方式创建多线程比实现Runnable接口方式创建多线程更加强大:

1.call可以有返回值

2.call可以抛出异常,被外面的操作捕捉,获取异常的信息

3.callable是支持泛型的

 

创建多线程的第四种党法:创建线程池

package java1;

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

public class ThreadPoor {
    public static void main(String[] args) {
        ExecutorService service = Executors.newFixedThreadPool(10); //1.提供制定数量线程的线程池
        ThreadPoolExecutor service1 = (ThreadPoolExecutor) service; //强转
        service1.setCorePoolSize(15); //设置线程池大小
        service.execute(new NumberThread());  //2.执行指定线程额操作,需要提供实现Runnable接口或Callable接口实现类的对象;execute方法用于实现Runnable接口
        //submit方法用于实现callable接口
        service.shutdown(); //3.关闭连接池

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

 

好处:1.提高影响速度(减少了创建新线程的时间)

           2.降低资源消耗(重复利用线程池中线程,不需要每次都创建)

           3.便于线程管理

设置核心池的大小:corePoolSize

最大线程数:maximumPoolSize

线程没有任务时最多保持多长时间后会终止

posted @ 2020-11-02 21:11  兔兔1234  阅读(149)  评论(0)    收藏  举报