天天看点

Java多线程(一)线程基础

定义 

    进程:一个计算机程序的运行实例,包含了需要执行的指令;有自己的独立地址空间,包含程序内容和数据;不同进程的地址空间是互相隔离的;进程拥有各种资源和状态信息,包括打开的文件、子进程和信号处理。

    线程:是进程中的一个执行流程,是CPU调度执行的基本单位,一个进程中可以运行多个线程;线程有自己的程序计数器、寄存器、堆栈和帧。同一进程中的线程共用相同的地址空间,同时共享进进程锁拥有的内存和其他资源。

分类

    线程总体分两类:用户线程和守候线程。

    守护线程(damon thread),守护线程在后台运行,提供程序运行时所需的服务。当虚拟机中运行的所有线程都是守护线程时,虚拟机终止运行。

意义

    多线程不能提高程序的执行速度,其实是为了提高应用程序的使用率,不让CPU闲置。

    程序的执行其实是抢占CPU资源,夺得CUP执行权,如果多进程下的某个进程的执行路径比较多,那么它就会有更高的几率抢到CPU的执行权。多线程只是多并发,并不是真正意义上的并行,多核系统才是真正意义上的并行。

    并发:通过CPU调度算法,让用户看上去同时执行,实际上,是通过CPU在高速切换,并不是真正的额同时

    并行:多个CPU实例或者多台机器同时执行一段处理逻辑,这就是真正的同时;

实现多线程的几种方式

    继承Thread类

public class MyThread extends Thread {
    public MyThread(String string) {
		super(string);
	}
	@Override
    public void run() {
		System.out.println(Thread.currentThread().getName() + " 问老师问题 .. ");
/*        while(true) {
            System.out.println(Thread.currentThread().getName() + " 问老师问题 .. ");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }*/
    }
    public static void main(String[] args) throws InterruptedException {
    	MyThread t1 = new MyThread("小明"); // 创建线程对象
    	MyThread t2 = new MyThread("小红");
        t1.start(); // 启动线程
        t2.start();
        System.out.println(Thread.currentThread().getName() + " is running ... "); // 打印当前线程的名字
        Thread.sleep(10000); // 休息10000ms t1,t2得到执行
        while (true) {
            System.out.println(Thread.currentThread().getName() + " is running ... "); // 打印当前线程的名字
            try {
                Thread.sleep(10000); // 休息1000ms
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }           
Java多线程(一)线程基础

  实现Runnable接口

public class MyRunnable implements Runnable {
    @Override
    public void run() {
        while(true) {
            System.out.println(Thread.currentThread().getName() + " is running .. ");
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    public static void main(String[] args) {
    	MyRunnable tt = new MyRunnable(); // 实例化线程任务类
        Thread t1 = new Thread(tt); // 创建线程对象,并将线程任务类作为构造方法参数传入
        Thread t2 = new Thread(tt);
        t1.start(); // 启动线程
        t2.start();
    }
}           

    定时器:可以利用定时器创建定时任务;可以利用框架实现,如:spring的schedule和quartz;也可以用jdk提供的api实现定时任务。

public class TimerDemo {
	    private static final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
	    public static void main(String[] args) throws Exception {
	        Timer timer = new Timer();
	        /**	
	         *	 1.在某个时间点后执行任务
	         * */
	        timer.schedule(new TimerTask() {
	            @Override
	            public void run() {
	            	String curentTime = format.format(new Date());
	                System.out.println(curentTime+":定时任务执行了....");
	            }
	        }, format.parse("2018-07-05 23:44:00"));
	        /**	
	         * 	2.延时一段时间执行任务
	         * */
	        timer.schedule(new TimerTask() {
				@Override
				public void run() {
					System.out.println("五秒后说:欢迎光临.....");
				}
			}, 5000);
	        /**
	         * 	3.每隔一段时间执行任务
	         * */
	        timer.schedule(new TimerTask() {
				@Override
				public void run() {
					System.out.println("每隔五秒说:欢迎光临.....");
				}
			}, new Date(),5000);
	    }
	}           
Java多线程(一)线程基础

    结合ExecutorService+Callable+Future实现具有返回结果的多线程,可结合线程池框架Executors框架实现。 详见:https://blog.csdn.net/zz_ddup/article/details/79945780

继续阅读