多线程(并发编程)

一、程序、进程 & 线程
 
 
【程序】
即program,港台翻译为“程式”= ̄ω ̄=;
程序 = 算法 + 数据结构 ,是指令的总和,在计算机中以文件的形式保存在存储器中;
(那么问题来了~什么是算法?什么是数据结构?
算法(Algorithm),是一个计算问题的具体步骤,是程序的逻辑抽象;
数据结构(data structure),是计算机中存储、组织数据的方式;数据结构,包括逻辑结构和物理结构。
逻辑结构是客观事物自身所具有的结构特点,而逻辑结构在计算机中的具体实现则成为物理结构。)
 
在上图中,每一个文件夹都是一个程序。
 
 
【进程】
即process,是已经运行的程序的实体;
一个进程包括一个或多个线程;
多线程(并发编程)
 在任务管理器中就可以看到当前的进程啦~
 
 
【线程】
即Thread,计算机中能进行运算调度的最小单位,是进程中的实际运作单位。一个进程中可以并发多个线程,
每个线程执行不同的任务。同一个进程的不同线程会共享部分资源。
※ 总的来说,就是进程是正在运行的程序,一个进程中包含一个或多个线程。就是酱~o( =•ω•= )miao~
 
 
二、顺序编程 & 并发编程
 
 
【顺序编程】
顺序编程就是在任意时刻,程序中的所有事物都只能执行一个步骤;
例如:
public static void main(String[] args) {
		// TODO Auto-generated method stub
		a();
		System.out.println("执行主函数");
	}
	public static void a(){
		b();
		System.out.println("执行a方法");
	}
	public static void b(){
		c();
		System.out.println("执行b方法");
	}
	public static void c(){
		System.out.println("执行c方法");
	}
◤运行结果◢
执行c方法
执行b方法
执行a方法
执行主函数
 
 
◤分析◢
在这个过程中,首先从main方法开始执行,调用了a方法,所以在a方法执行完直线,不会执行到输出语句的
代码,以此类推,在执行完b方法之前,不会输出a方法中的语句。那么,如果b方法由于某些原因不能继续执
行,则a方法和c方法都不能再继续执行,整个程序都将停下来知道外界条件发生改变,造成了任务的 阻塞
【并发编程】
并发编程,就是多线程编程,即多个线程同时并行执行,互不干扰;
并发编程,提升了程序的执行速度,同时能解决阻塞的问题。而且一个线程不能服务多个用户,执行多项任
务,那么就会造成资源的独占问题,并发编程可以同时执行多个任务。
但,并发编程也可能会造成不确定的错误。
例如:
public class MyThread implements Runnable {
	public int i;
	public static void main(String[] args) {
		for(int i=0;i<10;i++){
			MyThread mt = new MyThread(i);//创建一个新的线程
			//需要先执行start方法,Runnable中没有,只有Thread中有
			(new Thread(mt)).start();
		}
		System.out.println("main");
	}
	
	// 实现了 Rannable后,必须要重新写run方法
	public void run() {
		System.out.println("执行了第 "+i+" 个线程");
	}
	public MyThread (int i ){
		this.i = i;
	}
 ◤第一次运行结果◢
执行了第 1 个线程
执行了第 6 个线程
执行了第 0 个线程
main
执行了第 5 个线程
执行了第 8 个线程
执行了第 2 个线程
执行了第 3 个线程
执行了第 4 个线程
执行了第 7 个线程
执行了第 9 个线程
◤第二次运行结果◢
执行了第 1 个线程
执行了第 3 个线程
执行了第 0 个线程
main
执行了第 7 个线程
执行了第 6 个线程
执行了第 9 个线程
执行了第 5 个线程
执行了第 2 个线程
执行了第 8 个线程
执行了第 4 个线程
◤结果分析◢
每一个程序,jvm都为我们建了一个主线程,在这里主线程就是从mainfangfa开始执行,他要做的事情就是循
环,建立10个线程,然后输出一行语句,而那10个线程的运行情况与他无关,这10个线程各自独立运行,所
以每次的运行情况都有所不同。
 
 
三、多线程的实现
【实现Runnable接口】
Runnable中只有唯一的一个run()方法,当启动这个线程的时候,就会执行这个run()方法。同时,因为
Runnable中没有start()方法,在执行线程的时候,必须要新建一个Thread对象。
 
 
【继承Thread类】
理论上来说,继承Thread之后,并不一定要重写run()方法,但那样run()方法就为空,执行线程之后,调用
相应的run()方法,但是并没有其他实际的改变。
 
 
四、Thread的两个方法
【setPriority(int newPriority)】
设置优先级,本来以为优先级高的就一定先执行,优先级低则反之。但是,其实在这里设置优先级是没有太
大意义的,优先级高只是代表当多个线程同时处于就绪状态而去抢占CPU的时候,他先执行的概率大一点而已
(只是概率大一点啊w(゚Д゚)w,还必须是在哄抢的时候,要你何用啊摔(#‵′))
而且最终的执行顺序是由操作系统来决定的,傲娇的操作系统才不管你的优先级呢 ٩(๑❛ᴗ❛๑)۶
【sleep()】
休眠
执行时,因为可能会有异常,所以要放到try块里面,处理异常,其实我不太懂这里(逃~
try{
	Thread.sleep(100);//休眠0.1秒
	}
	catch(Exception e){
		e.printStackTrace();//异常
	}
 休眠可以有两个效果
一个是线程运行的太快,需要让他停下来等一等我们,比如在面板上画小球,运行得太快以至于人眼无法识
别,这时候就需要休眠了。
还有一个是对多个线程的运行顺序进行调度。
public static void main(String[] args) {
		for(int i=0;i<10;i++){
			MyThread mt = new MyThread(i);//创建一个新的线程
			try{
				sleep(1);//休眠0.001秒
			}catch(Exception e){
				e.printStackTrace();//处理抛出异常
			}
			mt.start();//执行线程
		}
	}
// 重新写run方法
	public void run() {
		
		System.out.println("执行了第 "+i+" 个线程");
		
	}
 ◤运行结果◢
执行了第 0 个线程
执行了第 1 个线程
执行了第 2 个线程
执行了第 3 个线程
执行了第 4 个线程
执行了第 5 个线程
执行了第 6 个线程
执行了第 7 个线程
执行了第 8 个线程
执行了第 9 个线程

 

PS:我能不能说一句这个编辑器一点也不好用(ಥ_ಥ)~

 

 

你可能感兴趣的:(并发编程)