多线程理解

多线程理解

一、实现多线程方法有两种:

1.继承Thread类

2.实现Runnable接口

二、Runnable优势在于:

1、可以避免由于Java的单继承特性而带来的局限;

2、增强程序的健壮性,代码能够被多个线程共享,代码与数据是独立的;

3、适合多个相同程序代码的线程区处理同一资源的情况。

三、哪里用到多线程:

1、用户注册完成送大礼包/积分之类,且积分等也是另一个系统并比较耗时;且这类任务即使失败也不是特别重要的。
    2、后台线程:比如定期执行一些特殊任务,如定期更新配置文件,任务调度(如quartz),一些监控用于定期信息采集等。
    3、最典型的应用比如tomcat,tomcat内部采用的就是多线程,上百个客户端访问同一个web应用,tomcat接入后都是把后续的处理扔给一个新的线程来处理,这个新的线程最后调用到我们的servlet程序,比如doGet或者doPost方法。
    4、还有就是需要异步处理的时候,需要使用多线程。比如task a和task b要并行处理,单个线程只能串行处理,先做完task a然后再做task b。如果想要多个task同时执行的话,就必须为每个task分配一个线程,然后通过java虚拟机的线程调度,来同时执行多个任务。比如你的CPU是多核心的话,就可以让一个CPU执行一个线程。如果只有一个CPU的话,底层是按照分时复用的原则,各个线程按照时间片来获得CPU资源。
    5、特别耗时的操作,如备份数据库,可以开个线程执行备份,然后执行返回,前台不断向后台询问线程执行状态。

四、实例

package test3;


public class ThreadSum {
     private int j;
     public static void main(String[] args) {
    	 ThreadSum tt=new ThreadSum();
    	 Inc inc=tt.new Inc();
    	 Dec dec=tt.new Dec();
    	 for(int i=0;i<2;i++) {
    		Thread thread=new Thread(inc);
    		thread.start();
    		thread=new Thread(dec);
    		thread.start();
    	 }
     }
     private synchronized void inc() {
    	 j++;
    	 System.out.println(Thread.currentThread().getName()+"-inc:"+j);
     }
     private void dec() {
		j--;
		System.out.println(Thread.currentThread().getName()+"-dec:"+j);
	}
     class Inc implements Runnable{
		public void run() {
			for(int i=0;i<100;i++) {
				inc();
			}
		}
	}
     class Dec implements Runnable{
    	 public void run() {
    		 for(int i=0; i<100; i++) {
    			 dec();
    		 }
    	 }
     }
    
	
}