多线程:线程的创建
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
线程没有任务时最多保持多长时间后会终止

浙公网安备 33010602011771号