day11_面向对象_多线程

2018-11-18  本文已影响0人  简单的书写点

线程的定义

在同一个进程内又可以执行多个任务,而这每一个任务我就可以看出是一个线程。
线程:是程序的执行单元,执行路径。是程序使用CPU的最基本单位。
单线程:如果程序只有一条执行路径。
多线程:如果程序有多条执行路径。

线程的意义

    多线程的存在,不是提高程序的执行速度。其实是为了提高应用程序的使用率。
程序的执行其实都是在抢CPU的资源,CPU的执行权。
多个进程是在抢这个资源,而其中的某一个进程如果执行路径比较多,就会有更高的几率抢到      CPU的执行权。就好像我雇了20个人帮我抽奖,我抽到奖的几率相对我一个人
我们是不敢保证哪一个线程能够在哪个时刻抢到,所以线程的执行有随机性。

并行和并发的区别

并行:逻辑层面同时发生,指在一定时间内同时运行多个程序
并发:物理层面同时发生,指在一个时间点同时运行多个程序
JVM是多线程的,因为在程序运行的时候,除了主函数线程,至少还要有辣鸡回收这个线程。

如何实现多线程

首先,线程是依赖进程的,所以应该先创建一个进程出来
而线程是由系统创建的,但是JAVA是不能直接调用系统功能的,所以我们需要调用C/C++写好的程序来实现多线程程序
用C/C++调用系统功能创建进程,然后用JAVA去调用这样的东西,然后提供一些类(Thread)供我们使用,我们就可以实现多线程程序了

实现多线程的方法

创建新执行线有两种方法
一种方法是将类声明为Thread的子类,即继承Thread类
步骤:
A:自定义类继承Thread类
B:自定义类重写父类的run()方法,因为不是类中的所有方法都需要被线程执行,而这个时候,为了区分,用run()方法来包含那些需要被线程执行的代码。
C:创建对象
D:启动线程


public class MyThread extends Thread{
        public void run(){
        for(int x=0;x<10;i++){
            System.out.println(x);
            }
        }
        public static void main(String[] agrs){
        MyThread  my = new MyThread();
        my.run();
        }
}

但是此时run()方法并不是多线程的,如果想要使用多线程的方式,则需要了解start()方法
start()方法首先启动了线程,然后再由jvm去调用该线程的run()方法

//创建两个线程对象
MyThread my1 =new MyThread();
MyThread my2 =new MyThread();
my1.start();
my2.start();

但是这样的话,两个线程的输出都掺和在一起,无法分辨谁是谁,
可以通过在MyThread中使用从Thread继承的getName()方法,在输出值之前标记getName(),默认输出Thread-加序号,序号是按照线程执行的先后定义的 ,但是也可以使用setName()方法给定线程一个名称。例如:

public class MyThread extends Thread{
public void run(){
for(int x=0;x<10;i++){
System.out.println(getName()+"---"+x);
}
}
public static void main(String[] agrs){
MyThread my = new MyThread();
my.setName("王小帅");
my.run();
}
}

另一种方法是
实现Runable接口
步骤:
        A:自定义类MyThread实现Runnable接口
        B:重写run()方法
        C:创建MyRunnable类的对象
        D:创建Thread类的对象,并把C步骤的对象作为构造参数传递
代码:

package day12;

public class MyRunnable implements Runnable {
public void run() {
for(int i=0;i<=100;i++) {
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
}

package day12;

public class MyRunnableDemo {
public static void main(String[] args) {
//创建MyRunnable类的对象
MyRunnable my = new MyRunnable();
//创建Thread类的对象,并把C步骤的对象作为构造函数参数传递
Thread t1 =new Thread(my);
Thread t2 =new Thread(my);
t1.setName("零直选");
t2.setName("左丘明");
t1.start();
t2.start();
}
}


####多线程两种方式的图解比较和区别
![如图](https://img.haomeiwen.com/i14378624/3b8889bd7d6491ec.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)



####线程调度
#####线程休眠

public static void sleep(long millis)
参数为毫秒
线程休眠需要异常处理

#####加入线程
public final void join():等待该线程终止后其他线程再执行
#####礼让线程
public static void yield():暂停当前正在执行的线程对象,并执行其他线程
让多个线程的执行更和谐,并不能靠他保证一人一次

####线程的生命周期
![线程的生命周期](https://img.haomeiwen.com/i14378624/df7f95e824317dc2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)








上一篇 下一篇

猜你喜欢

热点阅读