黄浦区网站建设公司,前端做学校网站教务,wordpress有些主题和,龙岩网站优化费用多线程相关的概念
并发 并发是指在同一时间段内#xff0c;两个或多个任务在同一个处理器上交替执行#xff0c;使得在宏观上看起来像是同时进行。并发是通过快速切换任务来模拟同时执行的效果#xff0c;实际上在任何一个时刻点上只有一个任务在执行。 也就是说#xff0…多线程相关的概念
并发 并发是指在同一时间段内两个或多个任务在同一个处理器上交替执行使得在宏观上看起来像是同时进行。并发是通过快速切换任务来模拟同时执行的效果实际上在任何一个时刻点上只有一个任务在执行。 也就是说并发看起来像多个程序同时运行但真相是CPU一个个按顺序快速执行的结果给人造成程序在同一时刻都在运行的”假象“仿佛在并行
并行 并行是指两个或多个事件在同一时刻发生即多个指令或任务在同一时刻被多个处理器同时执行。在并行计算中每个处理器都独立地执行任务互不干扰。 并发就是真的多个程序在同时运行了现在很多电脑的处理器都是多核处理器其中多核处理器就是能够完成并行的必要条件 因为每个处理器在同一时刻只能处理一个事件当我们想要达到并发的状态需要多个处理器来分别处理每个事件。
进程 进程Process是计算机中的程序关于某数据集合上的一次运行活动是系统进行资源分配的基本单位是操作系统结构的基础。在早期面向进程设计的计算机结构中进程是程序的基本执行实体在当代面向线程设计的计算机结构中进程是线程的容器。程序是指令、数据及其组织形式的描述进程是程序的实体。 也就是说一个程序在运行时就会产生一个进程这个进程就是这个程序的一切数据和操作的集合例如当我们打开浏览器时系统中就会产生一个和浏览器相绑定的进程
线程 线程thread是操作系统能够进行运算调度的最小单位。它被包含在进程之中是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流一个进程中可以并发多个线程每条线程并行执行不同的任务。在Unix System V及SunOS中也被称为轻量进程lightweight processes但轻量进程更多指内核线程kernel thread而把用户线程user thread称为线程。 一个程序运行后会执行各种操作这种操作就是以线程的方式在计算机系统下执行的例如我们打开QQ会产生一个进程当我们打开一个好友的聊天框又会生成这个进程的聊天框线程来完成发送消息语音通话等任务。
下面来介绍如何在java程序中实现多线程运行
Java中创建线程
1. 通过实现Runnable接口
在Java中提供了Runnable这个接口我们想要创建新的线程可以定义新的类实现这个接口然后实现其中的run()方法在方法中编写我们的业务代码这个run方法是线程的入口
查看源码我们可以看到它的代码就是这么朴实无华
public interface Runnable {/*** When an object implementing interface codeRunnable/code is used* to create a thread, starting the thread causes the objects* coderun/code method to be called in that separately executing* thread.* p* The general contract of the method coderun/code is that it may* take any action whatsoever.** see java.lang.Thread#run()*/public abstract void run();
}
然后我们需要知道java中创建新的进程需要调用Thread类的start方法但是Runnable接口中也没有start方法呀但是我们可以创建一个Thread类型的对象用我们定义的实现了Runnable接口的类当作构造器参数实例化一个Thread类型的对象然后利用这个对象调用start方法它会自动调用我们新实现的run方法
查看源码我们可以看到Thread有这样一个构造器它的参数是Runnable类型我们知道接口类型可以接收实现了该接口的类的引用所以我们直接传入我们新定义的类即可 public Thread(Runnable target) {init(null, target, Thread- nextThreadNum(), 0);}
下面上代码示例大家可以自己运行试一下
public class ThRTest{public static void main(String []args) throws InterruptedException{Thread thread1new Thread(new Dog());thread1.start();//调用start方法才会创建一个线程thread1.setName(狗狗线程);//给线程设置一个名字System.out.println(thread1.getName()开始执行.......);//get方法可以获取线程的名字如果我们不自己设置会有一个默认的名字for(int i0;i10;i){System.out.println(主线程在执行i);Thread.sleep(500);//Thread类的静态方法可以让程序暂停单位时间}}}class Dog implements Runnable{int times0;Override //run方法中定义我们需要多线程执行的代码public void run() {while(true){System.out.println(狗狗线程执行中(times));try {Thread.sleep(500);//Thread类的静态方法可以让程序暂停单位时间} catch (InterruptedException e) {e.printStackTrace();}if(times20)break;}}}
上面这个代码在执行到主函数时会给主函数生成一个主线程然后当主线程执行到我们调用start方法时会为生成一个新的线程去执行我这个代码后又写了个循环输出字符串标记执行这个代码我们可以得到以下结果 这里我们可以看到主函数中的输出代码和我们自己创建的线程中的输出代码是并行执行的我刚学的时候感觉很神奇居然还能这么玩以上代码里面有一些Thread的方法都很简单大家看注释应该也能看明白这里就不一一解释了。
2.通过继承Thread类
前面我们已经使用过Thread类了其实Thread类也是实现了Runnable接口只不过是又新增了一些创建线程相关的方法而已。
我们通过源码查看Thread类的定义
public class Thread implements Runnable
可以看到它也是实现了接口Runnable
第一个方法中我们最后还是通过Thread类创建了线程因为start方法只有Thread类中有所以当我们新定义的类直接继承了Thread类的时候我们就可以直接创建我们定义的类的对象就可因为大家知道子类会继承父类的方法所以我们利用这个方法创建线程只需要对上面的代码略作修改
如下 public class ThRTest{public static void main(String []args) throws InterruptedException{Thread thread1new Dog();thread1.start();//调用start方法才会创建一个线程thread1.setName(狗狗线程);//给线程设置一个名字System.out.println(thread1.getName()开始执行.......);//get方法可以获取线程的名字如果我们不自己设置会有一个默认的名字for(int i0;i10;i){System.out.println(主线程在执行i);Thread.sleep(500);//Thread类的静态方法可以让程序暂停单位时间}}}class Dog extends Thread{int times0;Override //run方法中定义我们需要多线程执行的代码public void run() {while(true){System.out.println(狗狗线程执行中(times));try {Thread.sleep(500);//Thread类的静态方法可以让程序暂停单位时间} catch (InterruptedException e) {e.printStackTrace();}if(times20)break;}}}
结果和上面的一样这里就不展示了
为什么会有两种创建方法
很多朋友很疑惑为什么会有好几种方式创建线程这两种方法的区别和连续
我们可以看到两种方法一个是通过实现接口一个是通过继承提到继承我们就自然而然的离不开Java的继承规则不允许多继承即每个类最多只能继承一个类那如果我们新定义的Dog类继承自Animal类我们就只能利用实现Runnable接口的方式来创建线程了算是对java继承机制的一个弥补方便用户编程因为现实中很多类都需要继承别的类所以一般情况下都是利用实现接口这个方法。
实现接口类创建线程的优点
我们来看实现接口类创建线程的代码 Dog dgnew Dog();Thread thread1new Thread(dg);thread1.start();//调用start方法才会创建一个线程
我们只需要给Thread构造器传一个参数就可以创建线程那么当我们需要创建大量的相同的线程时我们就可以利用这个方式只需要创建一个Dog类对象然后重复创建Thread即可如果是继承的方式每生成一个线程我们都需要生成一个新的对象相对来说减少了内库占用也显得代码更加简洁实用。
总结
多线程在实际的应用程序中法非常常用例如我们在12306买票就是一个多线程的过程每个准备抢票的人的手机上都会生成一个抢票线程当全国几亿人同时访问这个软件它如何能不出错保证系统运行正常呢这里面涉及的并发并行和多线程知识非常之多。希望大家都要学好这一块的知识学习在路上加油