java基础专栏—Thread

进程概述

正在运行的程序就是进程java

单线程不会出现安全问题,可是效率堪忧安全

  • 分时调度:每一个线程平均占用CPU
  • 抢占调度:优先级不一样的线程能够

Thread子类实现线程

  1. 继承至Thread类,并重写Thread方法的run()
  2. 将要执行的代码放到run()中
  3. 建立子类对象,调用start(),屡次开启线程是不合法的
  4. 执行具备随机性

问什么要继承Thread类: 由于Thread类是线程类,继承至Thread的类,能够为写在run()的代码块提供一个模板。因此run是提供要运行的代码,start()才是开启线程。多线程

线程的内存: 内存会在开辟一个栈区,而后让run()进入到这个栈。栈内存都是线程私有的异步

Thread方法

public String getName():这是Thread的方法,并非子类的方法线程

public static Thread currentThread()code

public void setName(String name)用子类对象去调用这个方法对象

public void sleep(long second)==这个方法不能抛出异常,由于父类Thread不能抛出,因此子类也不能抛==继承

Runnable

  • 实现了Runnable接口的类
  • 覆盖run方法
  • 建立Thread类对象
  • 构造方法传递实现类,传递Runnable的接口实现类
  • 调用strat()
public subRunnable implements Runnable{
    public void run(){
        
    }
}
public static void main(String[] args){
    SubRunnable sr = new SubRunnable();
  	Thread th = new Thread(sr);
  	th.start();
}
  1. 接口解决了单继承的局限性
  2. 将任务对象,和线程对象分离

匿名内部类实现多线程

//匿名内部类是没有子类的
//继承方式 xxxclass extends Thread{public void run()}
//直接new Thread,这个匿名内部类就是Thread的子类
new Thread(){
    public void run(){
        
    }.start();
}
//匿名内部类实现类接口引用
Runnable r = new Runnable(){
    public void run(){
        
    };
  	new Thread(r).start;
}

new Thread(new Runnable(){
    public void run(){
        
    }
}).start();

线程池原理

​ 线程池就是用来存储线程的容器,当线程没又试用的时候就会将线程回收可是不关闭线程,能够重复使用这个线程,节省掉反复建立销毁线程的内存开销。sun公司在JKD1.5以后就提供了线程池的API接口

线程池这个容器都是由线程工厂生产的进程

|--Utils
	|--Executors
	
public static ExecutorService newFixedThreadPool(int nThreads)
  
ExecutorService:线程池接口
Future<?> submit(Runnable task)
Future<?> submit(Callable<?> task)
返回的是接口实际上是说返回的是这个接口的实现类ThreadPoolExecutor,让这个类去实现run
ExecutorService es = Executors.newFixedThreadPool(2);
es.submit(new Runnable());

es.shutdown();
//关闭线程池

Callable

Runnable接口存在的问题:

  1. run 方法是void的
  2. 不能排除异常
  3. 能够用Callable<V>接口来解决,其使用的方式和Runnable同样
  4. 重写Callable的call()
ExecutorService es = Executors.newFixedThreadPool(2);
es.submit(new Callable<?>());

//拿到返回值的方式Futere接口
Future<T> f = es.submit(new Callable<T>());
es.shutdown();
//关闭线程池

多线程异步计算实例

ExecutorService es = Executors.newFixedThreadPool(2);
es.submit(task);
es.submit(task);
//能够往构造器里面传入参数
相关文章
相关标签/搜索