Thread类本质上就是Runnable接口的一个实现类,代表一个线程对象。
public class MyThread extebds Thread{
public void run(){
//需要在线程中执行的逻辑
}
}
启动线程的唯一方法就是调用Thread类中定义的start方法,不能直接调用run方法。
这种编程实现线程的方法最大的限制就是java的单根继承,这种方式基本不同。
2.实现Runnable接口接口定义:
@FunctionalInterface 函数式接口注解声明,提供了JDK1.8中函数式编程的支持lambda表达式
public interface Runnable{
public abstract void run(); //线程中的执行逻辑
}
实现 Runnable接口可以采用定义独立类、定义内部类【匿名内部类】、lambda【jdk1.8+】
public calss RigthRunnable implements Runnable{
public void run(){
for(int i=0;i<50;i++){
System.out.println("右手。。。。。");
}
}
}
启动线程:
Thread t=new Thread(new RightRunnable());
t.start();
定义匿名内部类:
Thread t =new Thread(new Runnable(){
public voud run(){
for(int i=0;i<50;i++){
System.out.println("右手。。。。");
}
}
});
t.start();
lambda写法:
Thread t=new Thread(()->{
for(int i=0;i<50;i++){
System.out.println("右手。。。。");
}
});
t.start();
3.使用Callable和Future接口创建线程
创建Callable接口的实现类,并且实现call()方法。使用FutureTask类来包装Callable接口实现类的对象,并且以FutureTask对象作为Thread对象的target 来创建线程。
定义Callable接口的实现类:
public class MyCallable implements Callable{
int begin=0;
int end=0;
public MyCallable(int begin,int end){
this.begin=begin;
this.end=end;
}
public Integer call() throws Exception{
int res=0;
for(int i=begin;i
4.使用线程池创建线程
创建线程需要花费昂贵的资源和时间,如果每次都是任务到来时才创建线程对象,那么响应时间会边长,而且一个进程能够创建的线程数有限。为了避免这些问题,在程序启动时就创建若干个线程对象用于响应处理,这个就称为线程池,里面的每个线程就叫工作线程。
享元模式:享元模式Flyweight Pattern主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。
原型模式:优点:大大减少对象的创建,降低系统的内存,使效率提高。
缺点:提高了系统的复杂度,需要分离出外部状态和内部状态,而且外部状态具有固有化的性质,不应该随着内部状态的变化而变化,否则会造成系统的混乱。
使用场景:1、系统有大量相似对象。 2、需要缓冲池的场景。
原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。
使用线程池的优势重用存在的线程,减少对象的创建和消亡的开销,性能较好
可以有效地控制最大并发线程数,提供系统资源的利用率,同时避免过多的资源竞争
提供了定时执行、定期执行、单线程、并发数控制等功能
如何选用创建方式:一般创建线程对象时不建议使用extends Thread方法:单根继承体系
如果没有返回结果建议使用Runnable接口
如果有返回值建议使用Callable接口
如果使用线程比较频繁建议使用线程池,ThreadPoolExecutor
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)