我们学习了javase之后,还是会发现自己只学习了一些java的基础语法,并没有了解到一些更加高深的技术。现在让我们来更加深入的了解一下java吧!
关于进程与线程之间的关系,我们首先要了解什么是进程?
进程是在计算机操作系统用于管理和执行程序的基本单位。每个进程是一个正在运行的程序实例,拥有着独立的资源、内存空间、执行线程。
线程就是一个更加轻量级的进程(之后还会有更加轻量的线程——协程)
为什么我们会引入轻量级的进程呢?是因为
1.我们需要应对高并发。
2.避免进程的频繁创建与销毁。(因为进程的频繁的创建与销毁会消耗很多的cpu资源 导致性能下降)
3.简化了程序的结构,使程序更具模块化和清晰性。
那么我们如何去定义一个线程呢?首先我们需要先了解定义线程的类是什么?
thread类,他是我们定义线程需要用的类,我们来看一下他的构造方法
我们现在创建线程用到的构造方法是无参数的构造方法。(关于之后的构造方法会在后面的文章讲到)
多线程的调度是随机的,我们不可干扰到线程的调度方式(原因:cpu内核中的调度器的实现方式是一种类似于随机调度的方式,会抢占式的执行)但是java给我们提供了一些列的api让我们可以明面上的是控制了线程的调度方式 例如:join、wait……
定义线程有五种方法
第一种创建线程的方法: 通过继承与thread类 来重写run方法。
class mythread extends Thread{ @Override public void run() { while(true){ System.out.println("我是mythread线程!"); } } } public class thread1 { public static void main(String[] args) { Thread t = new mythread(); t.start(); while(true){ System.out.println("我是main线程"); } } }
这个操作打破了我们以往对程序的认知 为什么一个代码可以执行两个while循环? 这就是我们要学习的多线程!
第二种方法创建线程的方法 : 继承与runnable接口 重写run方法。
class myrunnable implements Runnable{ @Override public void run() { while(true){ System.out.println("我是runnable线程!"); } } } public class thread2 { public static void main(String[] args) { myrunnable r = new myrunnable(); Thread t = new Thread(r); t.start(); while(true){ System.out.println("我是main线程!"); } } }
第三种创建线程的方法:创建thread对象使用匿名内部类 重写run方法。
(在这里给大家解释一下匿名内部类 匿名内部类的特征:1.没有名字 2.只能创建一次,不能复用3.可以实现接口或继承类 主要用于简化代码,不用显式的创建一个新的类文件 还能达到一定的封装效果。缺点:代码可读性差 所以创建线程我们一般不会使用匿名内部类 就引入了lambda表达式来创建我们的线程)
public class thread3 { public static void main(String[] args) { Thread t = new Thread(){ @Override public void run() { while (true){ System.out.println("我是t线程!"); } } }; t.start(); while (true){ System.out.println("我是main线程!"); } } }
第四种创建线程的方法:创建runnable的对象 使用匿名内部类 重写run方法。
public class thread4 { public static void main(String[] args) { Thread t = new Thread(new Runnable() { @Override public void run() { while(true){ System.out.println("我是t线程!"); } } }); t.start(); while(true){ System.out.println("我是main线程!"); } } }
第五种创建线程的方法:lamdba表达式。
public class thread5 { public static void main(String[] args) { Thread t = new Thread(()->{ while(true){ System.out.println("我是t线程!"); } }); t.start(); while (true){ System.out.println("我是main线程!"); } } }
这就是五种创建线程的方法了。我推荐大家使用lambda表达式(匿名函数)来创建线程,因为代码结构简洁 清晰明了,减少了代码的冗余,提高了代码的可读性。