系统运维系列 之多线程应用

线程是程序执行的一条路径,一个进程中可以包含多条线程。

多线程并行和并发的区别:
并行就是两个任务同时运行,需要多核CPU资源;并发是指两个任务都请求运行,但是处理器只能接受一个任务的执行,于是采取的策略是两个任务轮流进行,由于间隔时间短,我们会感觉到两个任务同时进行。即并行要求的CPU性能要更高一些。

Java程序运行原理:
Java命令会启动Java虚拟机,启动JVM等于启动一个应用程序,也就是启动一个进程,该进程会自动启动一个主线程,然后主线程调用某个类的main方法。Java至少启动了垃圾回收线程和主线程,所以是多线程启动。

多线程实现方法1:
定义类继承Thread;
重写run方法;
把新线程做的事情写在run方法中;
创建线程对象;
开启新线程,内部会自动执行run()方法。
代码:

class MyThread extends Thread{
    
    
	public void run(){
    
    
		System.out.println("重写run方法");
	}
}

public static void main(String[] args){
    
    
	MyThread mt = new MyThread();
	mt.start();
}

多线程实现方法2:
定义类实现Runnable接口;
实现run方法;
把新线程做的事情写在run方法中;
创建自定义的Runnable子类对象;
创建Thread对象传入Runnable;
调用start()方法开启新线程,内部会自动调用Runnable的run()方法。
代码:

class MyRunnable implements Runnable{
    
    
	public void run(){
    
    
		System.out.println("重写run方法");
	}
}

public static void main(String[] args){
    
    
	MyRunnable mr = new MyRunnable();
	Thread t = new Thread(mr);
	t.start();
}

两种方式的区别:
继承Thread,由于子类重写了Thread类的run方法,当调用start,直接找子类的run方法;
实现Runnable时构造函数中传入Runnable的引用,成员变量记住了它,start()调用run方法时内部判断成员变量Runnable引用是否为空,不为空时编译看父类run,运行看子类run;
前者:可以直接使用Thread类中的方法,应用简单,但是如果已经有了父类,就不能使用该方法;后者:自己定义的线程类就算有了父类也没有关系,接口可以多实现,但是它不能直接使用Thread类中的方法,需要先获取到线程对象才可以,代码较为复杂。

PS:题外话:通过比较两种实现可以发现,第一种简单但是有使用局限性;第二种复杂但是可以多实现。任何事物没有十全十美的,我们要海纳百川,求同存异,严于律己,宽以待人~~~扯远了哈哈。。。

猜你喜欢

转载自blog.csdn.net/langxiaolin/article/details/113834251