浅谈Java多线程

时间:2020-12-29 19:26:04

       学习目标,我们要弄明白线程是什么?为什么要用线程?线程和进程的区别和联系?线程为什么有用以及怎么开始编写使用线程的简单程序。

       何为线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小。那多线程呢?

       多线程:在同一应用程序中有多个顺序流(同时)执行。

       进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1--n个线程。几乎每种操作系统都支持进程的概念 ―― 进程就是在某种程度上相互隔离的、独立运行的程序。线程化是允许多个活动共存于一个进程中的工具。

       多进程:在操作系统中能(同时)运行多个任务(程序)。

       为什么要用线程:每个 Java 程序都至少有一个线程 ― 主线程。使用线程的好处有1.使 UI 响应更快,2.利用多处理器系统,3.简化建模,4.执行异步或后台处理,5.更重要的是它能给用户一个好的体验。还值得注意的是,线程不是多多益善,任何事都会过犹不及,虽然线程可以大大简化许多类型的应用程序,过度使用线程可能会危及程序的性能及其可维护性。线程消耗了资源。因此,在不降低性能的情况下,可以创建的线程的数量是有限制的。尤其在单处理器系统中,使用多个线程会使主要消耗 CPU 资源的程序运行得更快。

       线程和进程的区别和联系线程和进程一样分为五个阶段:创建、就绪、运行、阻塞、终止。有时候,线程也称作轻量级进程。就象进程一样,线程在程序中是独立的、并发的执行路径,每个线程有它自己的堆栈、自己的程序计数器和自己的局部变量。但是,与分隔的进程相比,进程中的线程之间的隔离程度要小。它们共享内存、文件句柄和其它每个进程应有的状态。进程可以支持多个线程,它们看似同时执行,但互相之间并不同步。

       线程的使用:在java中要想实现多线程,有两种手段,一种是继续Thread类,另外一种是实现Runable接口。

       创建线程的方法1:定义一个线程类继承Thread并重写其中的方法run(),方法run()称为线程体。由于java只支持单继承,用这种方法定义的类不能再继承其他的类。

package com.example;

public class MyClass {
public static void main(String args[]){
//生成线程类对象
MyThread myThread=new MyThread();
//启动线程
myThread.start();
// myThread.run();//千万不要这样启动线程
}
}
//创建一个类继承Thread
class MyThread extends Thread{
@Override
public void run() {//线程体
for (int i=0;i<50;i++){
System.out.println("Thread"+i);
}
}
}

浅谈Java多线程

这是单线程,接下来我们看下多线程,很简单,在上面的main方法中也来个for循环就行。

package com.example;

public class MyClass {
public static void main(String args[]){
//生成线程类对象
MyThread myThread=new MyThread();
//启动线程
myThread.start();
// myThread.run();//千万不要这样启动线程
for (int i=0;i<50;i++){
System.out.println("main"+i);
}
}
}
//创建一个类继承Thread
class MyThread extends Thread{
@Override
public void run() {//线程体
for (int i=0;i<50;i++){
System.out.println("Thread"+i);
}
}
}

浅谈Java多线程多线程执行过程效果图,

      创建线程的方法2:提供一个实现接口Runnable的类作为线程的目标对象,在初始化一个Thread类或者Thread子类的线程对象时,把目标对象传递给这个线程实例,由该目标对象提供线程体。

package com.example;

public class MyClass {
public static void main(String args[]){

//生成一个Runnable接口实现类对象
MyRunnable runnable=new MyRunnable();
//生成一个Thread对象,并将Runnable接口实现类的对象
//作为参数传给Thread对象
Thread thread=new Thread(runnable);
//通知Thread对象执行start()方法
thread.start();
}
}

//
class MyRunnable implements Runnable{
@Override
public void run() {
for (int i=0;i<50;i++){
System.out.println("Runnable"+i);
}
}
}

浅谈Java多线程

这两种线程的创建方法,第一种比较简单,第二种复杂一点点,在平常的实用中,第二种方法用的比较多。这就和java的单继承有点关系了。

      线程的执行过程(其实就是生命周期):来几发图片浅谈Java多线程

浅谈Java多线程

        单线程执行过程很好理解,一根筋。多线程的话,他们是切换来执行的,线程1执行一小部分,线程2也执行一小部分,其实呀!线程1和线程2在抢着执行(竞争执行)。因为CPU切换速度很快,我们经常会误以为多线程是同时执行的,其实不是同步。

浅谈Java多线程


浅谈Java多线程

线程的简单控制方法:

中断线程:

----Thread.sleep();进入休眠状态,线程经过一段时间醒过来还需继续抢CUP资源

----Thread.yield();自动让出CUP资源

设置线程的优先级(线程优先级最大值是10,最小是1,可以通过Thread的静态方法来设置优先级。线程运行快不快还得看它抢CPU的能力)

----getPriority();

----setPriority();


java多线程我们就先学到这里,后面会更新java线程高级部分内容。