国内网站放国外服务器,北京网站建设网络推广公司,网站建设费用一年多少钱,如何做装修网站线程 多线程就是一个程序中有多个线程在同时执行。 多线程下CPU的工作原理 实际上#xff0c;CPU(中央处理器)使用抢占式调度模式在多个线程间进行着高速的切换。对于CPU的一个核而言#xff0c;某个时刻#xff0c;只能执行一个线程#xff0c;而CPU的在多个线程间切换速度…线程 多线程就是一个程序中有多个线程在同时执行。 多线程下CPU的工作原理 实际上CPU(中央处理器)使用抢占式调度模式在多个线程间进行着高速的切换。对于CPU的一个核而言某个时刻只能执行一个线程而CPU的在多个线程间切换速度相对我们的感觉要快看上去就是在同一时刻运行。 其实多线程程序并不能提高程序的运行速度但能够提高程序运行效率让CPU的使用率更高。 一、创建线程 方法1继承Thread类重写run方法 public class SubThread extends Thread{public SubThread(){super(x5456); //通过构造方法修改线程名}public void run() {for(int i0;i100;i){System.out.println(super.getName()i);}}
} 调用 public static void main(String[] args) {//创建刚刚继承Thread类的子类的对象SubThread st new SubThread();//通过setName方法修改线程名st.setName(x54256);//调用对象的start方法会自动执行我们重写的run方法st.start();for(int i0;i100;i) {System.out.println(Thread.currentThread().getName()i); //获取当前线程的对象调用getname()方法}
}方法2实现接口Runnable重写run方法 public class SubRunnable implements Runnable{public void run(){for(int i0;i100;i){try {// 调用Thread类的sleep方法休眠50ms由于父接口没有throws异常so我们只能用try...catchThread.sleep(50); } catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName()...i);}}
}调用 public static void main(String[] args) {//创建实现Runnable接口的类的对象SubRunnable sr new SubRunnable();//创建Thread类的对象Thread t new Thread(sr);//启动线程t.start();for(int i0;i100;i){System.out.println(Thread.currentThread().getName()...i);}
}方法3使用匿名内部类,实现多线程程序 匿名内部类的前提继承或者接口实现 使用方法 new 父类或者接口(){ 重写抽象方法} public static void main(String[] args) {//继承方式 XXX extends Thread{ public void run(){}}new Thread(){public void run(){System.out.println(!!!);}}.start();//实现接口方式 XXX implements Runnable{ public void run(){}}Runnable r new Runnable(){public void run(){System.out.println(###);}};new Thread(r).start();//或new Thread(new Runnable(){public void run(){System.out.println();}}).start();} 实现接口的好处 高内聚低耦合模块内能做的事就自己做模块间的关系要尽量的小 第二种方式实现Runnable接口避免了单继承的局限性所以较为常用。实现Runnable接口的方式更加的符合面向对象线程分为两部分一部分线程对象一部分线程任务。继承Thread类线程对象和线程任务耦合在一起。一旦创建Thread类的子类对象既是线程对象有又有线程任务。实现runnable接口将线程任务单独分离出来封装成对象类型就是Runnable接口类型。Runnable接口对线程对象和线程任务进行解耦。 多线程的内存图解 线程的一生 二、线程池 线程池其实就是一个容纳多个线程的容器其中的线程可以反复使用省去了频繁创建线程对象的操作无需反复创建线程而消耗过多资源。 在java中如果每个请求到达就创建一个新线程开销是相当大的。在实际使用中创建和销毁线程花费的时间和消耗的系统资源都相当大甚至可能要比在处理实际的用户请求的时间和资源要多的多。除了创建和销毁线程的开销之外活动的线程也需要消耗系统资源。如果在一个jvm里创建太多的线程可能会使系统由于过度消耗内存或“切换过度”而导致系统资源不足。为了防止资源不足需要采取一些办法来限制任何给定时刻处理的请求数目尽可能减少创建和销毁线程的次数特别是一些资源耗费比较大的线程的创建和销毁尽量利用已有对象来进行服务。 线程池主要用来解决线程生命周期开销问题和资源不足问题。通过对多个任务重复使用线程线程创建的开销就被分摊到了多个任务上了而且由于在请求到达时线程已经存在所以消除了线程创建所带来的延迟。这样就可以立即为请求服务使用应用程序响应更快。另外通过适当的调整线程中的线程数目可以防止出现资源不足的情况。 方法1使用线程池方式--Runnable接口 public static void main(String[] args) {//调用工厂类的静态方法,创建线程池对象ExecutorService接口的实现类//返回线程池对象,是返回的接口ExecutorService es Executors.newFixedThreadPool(2); //池内有2个线程//调用接口实现类对象es中的方法submit提交线程任务//将Runnable接口实现类对象,传递es.submit(new SubRunnable());es.submit(new SubRunnable());es.submit(new SubRunnable());es.submit(new SubRunnable());
}实现的Runnable接口 public class ThreadPoolRunnable implements Runnable {public void run(){System.out.println(Thread.currentThread().getName() 线程提交任务);}
} 方法2使用线程池方式—Callable接口 之前的实现方法线程运行完没有返回值而且不能抛异常。 Callable接口与Runnable接口功能相似用来指定线程的任务。其中的call()方法用来返回线程任务执行完毕后的结果call方法可抛出异常。 public static void main(String[] args) throws ExecutionException, InterruptedException {ExecutorService es Executors.newFixedThreadPool(2);//提交线程任务的方法submit方法返回 Future接口的实现类FutureInteger f es.submit(new SubCallable());//获取返回值Integer i f.get();System.out.println(i);
} 实现的Callable接口 public class SubCallable implements CallableInteger{Overridepublic Integer call() {return 123;}
}使用线程实现异步计算 private int a;
//通过构造方法传参
public GetSumCallable(int a){this.aa;
}public Integer call(){int sum 0 ;for(int i 1 ; i a ; i){sum sum i ;}return sum;
}ThreadPoolDemo.java /** 使用多线程技术,求和* 两个线程,1个线程计算1100,另一个线程计算1200的和* 多线程的异步计算*/
public class ThreadPoolDemo {public static void main(String[] args)throws Exception {ExecutorService es Executors.newFixedThreadPool(2);FutureInteger f1 es.submit(new GetSumCallable(100));FutureInteger f2 es.submit(new GetSumCallable(200));System.out.println(f1.get());System.out.println(f2.get());es.shutdown();}
}FutureTask的使用 FutureTask继承了Callable和Future接口所以它既能像callable一样被Thread执行也能像Future那样获取结果。 Overridepublic boolean testServiceUrl(ServiceUrlTestDTO url){// 调用地图服务CallableBoolean callable new WebServiceUtil(url.getUrl(),url.getProxy(),url.getToken());FutureTaskBoolean futureTask new FutureTask(callable);Thread thread new Thread(futureTask);thread.start();try {Boolean isOK futureTask.get();System.out.println(服务【 url.getUrl() 】测试 isOK);return isOK;} catch (InterruptedException e) {e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();}return false;}转载于:https://www.cnblogs.com/x54256/p/8443794.html