美文网首页
java之多线程

java之多线程

作者: 是归人不是过客 | 来源:发表于2020-09-25 18:50 被阅读0次

1、 什么是进程?

一个进程代表一个应用程序

2、多进程有什么作用?

单进程计算机只能做一件事情。

多进程不是提高运行速度,而是体高CPU的使用率

进程和进程的内存是独立的

3、什么是线程

线程是一个进程中的执行场景。一个进程可以启动多个线程

4、多线程有什么作用

多线程不是为了提高执行速度,而是提高应用程序的使用率

线程和线程共享“堆内存和方法区内存”,栈内存是独立的,一个线程一个栈

5、java程序的运行原理

java命令会启动java虚拟机,启动JVM,等同于启动了一个应用程序,表示启动了一个

进程,该进程会自动启动一个主线程,然后主线程去调用某个类中的main方法,所以

main方法运行在主线程中,在此之前所有程序都是单线程的

举个栗子:

分析一下程序有几个线程?

class Test {
    public static void main(String[] args){
        m1();
    }
    public static void m1() {
        m2();
    }
    public static void m2() {
        m3();
    }
    public static void m3() {
        System.out.println("m3....");
    }
}

java中多线程的实现方式

在java语言中实现多线程的第一种方法:

step1、继承java.lang.Thread

step2、重写run方法

如何定义线程?
如何创建线程?
如何启动线程?

举个栗子:

class Test {
    public static void main(String[] args){
        
        //创建线程
        Thread t = new Processor();
        // 启动线程
        t.start(); // 这段代码执行瞬间结束,告诉JVM再分配一个新的栈给t线程
                   // run方法不需要程序员手动调用,系统线程启动之后自动调用run方法
        
        // 这段线程在主线程中运行
        for(int i = 0; i < 10;i++) {
            System.out.println("main -- > " + i);
        }
        // 有了多线程之厚,main方法结束只是主线程栈中没有方法栈帧了
        // 但是其他线程或者其他栈中还有栈帧
        // main方法结束,程序可能还在运行
    }
}
// 定义一个线程
class Processor extends Thread{
    // 重写run方法
    public void run() {
        for(int i = 0;i < 10; i++) {
            System.out.println("run -- > " + i);
        }
    }
}

解释如图:

JVM

java中实现线程的第二种方式:

step1、写一个类实现java.lang.Runnable接口

step2、实现run方法

class Test {
    public static void main(String[] args){
        
        //创建线程
        Thread t = new Thread(new Processor());
        // 启动线程
        t.start(); // 这段代码执行瞬间结束,告诉JVM再分配一个新的栈给t线程
                   // run方法不需要程序员手动调用,系统线程启动之后自动调用run方法
        
        // 这段线程在主线程中运行
        for(int i = 0; i < 10;i++) {
            System.out.println("main -- > " + i);
        }
    }
}
// 这种方式是推荐的,因为一个类实现接口之外保留了类的继承
class Processor implements Runnable{
    // 重写run方法
    public void run() {
        for(int i = 0;i < 10; i++) {
            System.out.println("run -- > " + i);
        }
    }
}

线程生命周期如下图:

优先级分类:最高级、标准级、最低级

优先级高的获取cpu时间片相对多一些
优先级:1-10
最低 1
最高 10
默认 5

class Test {
    public static void main(String[] args){
        
        System.out.println(Thread.MAX_PRIORITY); // 10
        System.out.println(Thread.MIN_PRIORITY); // 1
        System.out.println(Thread.NORM_PRIORITY); // 5
        
        Thread t1 = new Processor();
        t1.setName("t1");
        
        Thread t2 = new Processor();
        t1.setName("t2");
        
        System.out.println(t1.getPriority()); // 5
        System.out.println(t2.getPriority()); // 5
        // 获取优先级
        t1.setPriority(5);
        t2.setPriority(10);
        // 设置优先级
        t1.start();
        t2.start();
        
    }
}
// 这种方式是推荐的,因为一个类实现接口之外保留了类的继承
class Processor extends Thread{
    // 重写run方法
    public void run() {
        for(int i = 0;i < 10;i++) {
            System.out.println(Thread.currentThread().getName() + "-->" + i);
        }
    }
}
class Test {
    public static void main(String[] args){
        // 如何获得当前线程对象
        Thread t = Thread.currentThread(); // t保存内存地址指向的线程是”主线程对象“
        
        // 获取线程的名字
        System.out.println(t.getName()); // main
        
        Thread t1 = new Thread(new Processor());
        t1.start();
        
        Thread t2 = new Thread(new Processor());
        t2.setName("hl"); // 改名
        t2.start();
    }
}
// 这种方式是推荐的,因为一个类实现接口之外保留了类的继承
class Processor extends Thread{
    // 重写run方法
    public void run() {
        Thread t = Thread.currentThread(); // t保存的内存地址指向的线程是t1线程对象
        System.out.println(t.getName()); // Thread-0
    }
}

三个方法:

1、获取当前线程对象 Thread.currentThread();

2、给线程起名字 t.setName();

3、获取线程的名字 t.getName();

class Test {
    public static void main(String[] args){
        // 如何获得当前线程对象
        Thread t = Thread.currentThread(); // t保存内存地址指向的线程是”主线程对象“      
        Thread t1 = new Thread(new Processor());
        t1.start();
        
    }
}
// 这种方式是推荐的,因为一个类实现接口之外保留了类的继承
class Processor extends Thread{
    // 重写run方法
    public void run() {
        for(int i = 0; i < 10;i++) {
            System.out.println(Thread.currentThread().getName() + " -- >" + i);
            try {
                Thread.sleep(1000);  // 让当前线程堵塞一秒
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

一道面试题:

问下列程序是否发生堵塞

class Test {
    public static void main(String[] args){
        
        // 创建线程
        Thread t = new Processor();
        t.setName("t");
        
        t.start();// 启动线程
        
        //休眠
        try {
            t.sleep(5000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } // 等同于Thread.sleep(5000);堵塞的是当前线程,和t线程无关
        
        System.out.println("Hello world!");
    }
}
// 这种方式是推荐的,因为一个类实现接口之外保留了类的继承
class Processor extends Thread{
    public void run() {
        for(int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName() + "---->" + i);
        }
    }
}

1、Thread.sleep(毫秒)
2、sleep方法是一个静态方法
3、该方法的作用,阻塞当前线程,腾出cpu,让给其它线程

class Test {
    public static void main(String[] args){
        
        // 创建线程
        Thread t = new Processor();
        t.setName("t");
        
        t.start();// 启动线程
        
        //休眠
        try {
            t.sleep(5000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } // 等同于Thread.sleep(5000);堵塞的是当前线程,和t线程无关
        
        System.out.println("Hello world!");
    }
}
// 这种方式是推荐的,因为一个类实现接口之外保留了类的继承
class Processor extends Thread{
    public void run() {
        for(int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName() + "---->" + i);
        }
    }
}

相关文章

  • 2018-08-15

    java学习第一天之多线程 包:java.lang : 类:class...

  • 【java基础】线程

    java基础 线程 参考详细:Java之多线程 一、创建线程 创建线程常见有两种方式,另外有两种新增方式 1.Th...

  • Java之多线程

    这个东西不用说,必学,必用,面试必问 一.概念 先来介绍一下进程线程的区别,进程就是一个电脑上运行的各个应用程序....

  • Java之多线程

    Thread(耦合,不推荐) Runnable(解耦,推荐) Executors ExecutorService ...

  • Java之多线程

    今天考虑有关线程的代码问题,如何写多线程,什么的东西应该定义为线程?等等等。。 随笔记下来,防止后面忘记了。。什么...

  • Java之多线程

    Java多线程概念 进程(Process):  进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态...

  • java之多线程

    1、 什么是进程? 一个进程代表一个应用程序 2、多进程有什么作用? 单进程计算机只能做一件事情。 多进程不是提高...

  • JAVA之多线程

    ▷ 进程、线程和多线程 进程: 定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统...

  • iOS开发之多线程(5)—— Pthreads

    文集 iOS开发之多线程(1)—— 概述iOS开发之多线程(2)—— ThreadiOS开发之多线程(3)—— G...

  • iOS开发之多线程(4)—— Operation

    文集 iOS开发之多线程(1)—— 概述iOS开发之多线程(2)—— ThreadiOS开发之多线程(3)—— G...

网友评论

      本文标题:java之多线程

      本文链接:https://www.haomeiwen.com/subject/xbufuktx.html