多线程-基础(1)

电脑中时会有很多单独运行的程序,每个程序有一个独立的进程,而进程之间是相互独立存在的。比如我们电脑中的QQ、微信,网易播放器、电脑管家等等.

什么是线程?
进程想要执行任务就需要依赖线程。换句话说,就是进程中的最小执行单位就是线程,并且一个进程中至少有一个线程。

什么是多线程?
提到多线程这里要说两个概念,就是串行和并行,搞清楚这个,我们才能更好地理解多线程。

所谓串行,其实是相对于单条线程来执行多个任务来说的,我们就拿下载文件来举个例子:当我们下载多个文件时,在串行中它是按照一定的顺序去进行下载的,也就是说,必须等下载完A之后才能开始下载B,它们在时间上是不可能发生重叠的。
在这里插入图片描述
并行:下载多个文件,开启多条线程,多个文件同时进行下载,这里是严格意义上的,在同一时刻发生的,并行在时间上是重叠的。

在这里插入图片描述
那么什么是多线程呐?
举个例子,我们打开腾讯管家,腾讯管家本身就是一个程序,也就是说它就是一个进程,它里面有很多的功能,我们可以看下图,能查杀病毒、清理垃圾、电脑加速等众多功能。

按照单线程来说,无论你想要清理垃圾、还是要病毒查杀,那么你必须先做完其中的一件事,才能做下一件事,这里面是有一个执行顺序的。
如果是多线程的话,我们其实在清理垃圾的时候,还可以进行查杀病毒、电脑加速等等其他的操作,这个是严格意义上的同一时刻发生的,没有执行上的先后顺序。
在这里插入图片描述
如何实现多线程:
第一种:实现Runnable接口

public class Printnum implements Runnable{
    
    

	int num = 1;
	@Override
	public void run() {
    
    
		
		while(true){
    
    
			synchronized (this) {
    
    
				notify();  //唤醒等待的线程,每次随机唤醒一个线程
				if (num <= 10) {
    
    
					System.out.println(Thread.currentThread().getName() + ":"+ num);
					num++;
				} else {
    
    
					break;
				}
				try {
    
    
					wait();//表示线程一直等待,等待唤醒,直到其它线程通知
				} catch (InterruptedException e) {
    
    
					e.printStackTrace();
				}
			}
		}
	}
}

测试类:

public class PrintText {
    
    

	//线程通讯
	//使用两个线程打印 1-10. 线程1, 线程2 交替打印
	public static void main(String[] args) {
    
    
		
		Printnum pn = new Printnum();
		
		Thread r1 = new Thread(pn,"线程一");
		Thread r2 = new Thread(pn,"线程二");
		
	    r1.start();
	    r2.start();
	}
}

运行结果:
在这里插入图片描述
第二种:继承Thread类

public class SubThread extends Thread{
    
    

	//子线程
	@Override
	public void run() {
    
      //调用线程时调用方法
		for(int i=0;i<=100;i++){
    
    
			try {
    
    
				Thread.sleep(100);  //每次执行子线程前先休眠100毫秒在执行
			} catch (InterruptedException e) {
    
    
				e.printStackTrace();
			}
			
			//Thread.currentThread()为返回当前线程,即SubThread里的线程
			System.out.println(Thread.currentThread().getName()+":"+i); 
		}
	}
}

测试类:

public class Text {
    
    

	//主线程,main就是主线程
	public static void main(String[] args) {
    
    
		
		//调用子线程
		SubThread subthread = new SubThread();
		subthread.setName("子线程"); //设置线程名字
		
		//设计子线程优先级,1~10,10最高;或者MAX_PRIORITY:取值为10;MIN_PRIORITY:取值为1;NORM_PRIORITY:取值为5
		subthread.setPriority(Thread.NORM_PRIORITY);
		subthread.start();  //启动线程,注意:不是subthread.run();否则调用方法,而不是启动线程,虽然子程序启动在前,但是是先执行主程序
		
		Thread.currentThread().setName("主线程");
		for(int i=0;i<=100;i++){
    
    
			//Thread.currentThread()为返回当前线程,即main里的线程
			System.out.println(Thread.currentThread().getName()+":"+i);
		 
			if(i==20){
    
    
				try {
    
    
					subthread.join();  //当主线程到了20时加入子线程,让子线程执行完后才执行主线程
				} catch (InterruptedException e) {
    
    
					e.printStackTrace();
				}
			}
			if(i==90){
    
    
				subthread.stop(); //当主线程执行到90时,让子线程强行停止
			}
		}
	}
}

运行结果:
图一
图一

在这里插入图片描述
图二

后面会相继发布多线程的相关文章,敬请关注。

猜你喜欢

转载自blog.csdn.net/weixin_42409759/article/details/107748295
今日推荐