多线程(上)

多线程

我们学习多线程,首先先学习什么是进程,线程依赖于进程存在

进程:系统可以进行独立调配并且是一个不可分割 独立单元

开启一个任务管理器,很多进程(应用软件/某些客户端)

什么是多进程?

多进程的意义:是为了提高CPU的使用率

现在计算机都是多进程,假设:在听音乐的同时,也在打游戏..,他们是同时进行的吗?

他们不是同时进行的,感觉同时,一点点CPU的时间片在同一个时刻在两个进程之间进行高效的切换!

什么线程?

线程:进程的一个独立的单元

一个进程里面有多个任务,把每一个任务看成一个线程

多线程:

线程之间在抢占CPU的执行权(抢占资源)

多线程的执行具有随机性

举例"

打篮球:1v1 两个人抢占篮球的几率同样大

  1v5   5个人抢占篮球的几率大,并不能说一定抢到 (随机性的)

 

 

 

JVM:Java虚拟机 识别main(主线程)

 

JVM是多线程程序吗?至少有几条线程..

  jvm是多线程的,

  至少有2条线程...

  有主线程,main..执行这些代码,能够被Jvm识别

  在执行一些程序的时候,一些对象Jvm释放掉,原因,

  它开启了垃圾回收线程,里面GC:垃圾回收器(回收一些没有更多引用的对象或者变量...)

 

MyThread类就是一个执行线程类

 并且重写Thread类中的run 方法

 run()方法里面应该是一些耗时的操作,IO操作/循环语句..

 

 

 

如何实现多线程程序呢?

 要实现多线程程序,需要开启进程,

 开启进程,是需要创建系统资源,但是Java语言不能创建系统资源

 只有C/C++可以创建系统资源, 利用c语言创建好的系统资源实现

 Java提供了一个类:Thread

 实现多线程程序的步骤:

 1)将类声明为 Thread 的子类

 2)该子类应重写 Thread 类的 run 方法

 3)在主线程进行该自定义的线程类的对象的创建

 

/*public void start()使该线程开始执行;Java 虚拟机调用该线程的 run 方法。

结果是两个线程并发地运行*/  

 错误//IllegalThreadStateException:非法状态异常,同一个线程只能被执行一次

(下面创建的是Thread的子继承类)

package test11;

//条件一必须是Thread的子类

public class XlhThread extends Thread {

@Override

//条件而必须有方法重写

public void run() {

for (int x = 0 ; x < 10 ; x++) {

System.out.println("nihao"+x);

}

}

}

(测试类)

 

public class ThreadTest1 {

public static void main(String[] args) {

//条件三:创建线程对象

XlhThread xt = new XlhThread();

xt.run();//这样执行的并不是线程,而是普通地执行run 方法

System.out.println("-----------");

//开始执行线程

xt.start();

}

}

 

 

 

 并行和并发(高并发:MyBatis --->IBatis:半自动化)

 强者逻辑上的同时,指的是同一个时间段内

 后者物理上的同时,指的是同一个时间点

 

 

 

 

Thread 类提供了一些方法

 public final void setName(String name):给线程起名称

public final String getName() :获取线程名称

 

 

 public static void main(String[] args) {

//利用无参构造创建线程对象

MyTread mt1 = new MyTread();

MyTread mt2 = new MyTread();

//设置名字

mt1.setName("丸子");

mt2.setName("叉烧");

//启动线程

mt1.start();

mt2.start();

}

}

 

 

 

 

 

public final void setDaemon(boolean on) :true,表示为守护线程

 将该线程标记为守护线程或用户线程。当正在运行的线程都是守护线程时,Java 虚拟机退出。(守护线程不会立即结束掉,它会执行一段时间在结束掉)

 该方法必须在启动线程前调用。

package Test13;

public class Test3 {

public static void main(String[] args) {

MyTread mt1 = new MyTread();

MyTread mt2 = new MyTread();

//设置两个守护线程,在启动线程前设置

mt1.setName("努力");

mt2.setName("乐观");

mt1.setDaemon(true);

mt2.setDaemon(true);

mt1.start();

mt2.start();

//设置当前要守护的主线程的名字

Thread.currentThread().setName("");

for (int x = 0 ; x < 5 ; x++) {

System.out.println(Thread.currentThread().getName()+ x);

}

}

}

 

 

结果

 

 

分析 :

结果结束后,发现原本可以执行到一百的线程被设置为守护后只执行到51,因为

该守护的人线程已经结束 所以慢慢地结束了

 

 

 

 

public final void join():等待该线程终止 interruputedException 中断异常

 

 分别创建三个子线程,让第一个子线程执行之后,调用join()等待该线程中,在执行t2,t3线程

 

public static void main(String[] args) throws Exception {

MyTread mt1 = new MyTread();

MyTread mt2 = new MyTread();

MyTread mt3 = new MyTread();

mt1.setName("MSI");

mt2.setName("S");

mt3.setName("IEM");

mt1.start();

//等待mt1线程结束才能调用mt2以及mt3线程

mt1.join();

mt2.start();

mt3.start();

}

 

 

最后的结果分析:

Mt1线程执行完毕之后,mt2mt3才开始抢占线程

 

 

 

 

跟线程优先级相关的方法:

 public final int getPriority()返回线程的优先级。

 public final void setPriority(int newPriority)更改线程的优先级

 线程存在一个默认优先级  

 

public static final int MAX_PRIORITY 10 最大优先级

 public static final int MIN_PRIORITY 1 最小优先级

 public static final int NORM_PRIORITY 5 默认优先级

 

 

 

 

 public static void sleep(long millis):线程睡眠 指定是时间毫秒值

  throws InterruptedException

 

 两个区别?

public final void stop() ;强迫线程停止执行。不会执行了 (过时了),方法能使用的

public void interrupt()中断线程。 表示中断线程的一种状态

 

 

(代码,继承了Thread的子类)

 

package Test13;

import java.util.Date;

public class SleepThread  extends Thread{

@Override

public void run() {

for ( int x = 0 ; x < 10 ; x++) {

System.out.println(getName()+","+new Date());

try {

//休眠一秒,

Thread.sleep(1000);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

}

 

 

public final void stop() ;强迫线程停止执行。不会执行了 (过时了),方法能使用的

public void interrupt()中断线程。 表示中断线程的一种状态

 

 

 

 

实现线程其实有两种方式

第一种:继承关系Extends

实现多线程程序的步骤:

  1)将类声明为 Thread 的子类

  2)该子类应重写 Thread 类的 run 方法

  3)在主线程进行该自定义的线程类的对象的创建

实现多线程程序的第二种方式:

1)自定义一个类,实现Runnable接口

  2)实现接口中的run方法,对耗时的代码进行操作

  3)然后在主线程中创建该了对象,将该类对象做为一个资源类,创建Threadd类的对象,将刚才的资源类作为参数进行传递

猜你喜欢

转载自blog.csdn.net/qq_35501660/article/details/80456356