首页 > 编程语言 >Java多线程回顾总结

Java多线程回顾总结

时间:2024-11-18 20:14:10浏览次数:3  
标签:Java Thread System 回顾总结 线程 println new 多线程 public

目录

一.线程与创建线程方式简介

二.Thread继承

三.实现Runnable接口

四.Callable接口

五.使用线程池


一.线程与创建线程方式简介

线程与进程的区别:
1、一个进程至少包含一个线程
2、比如电脑上QQ,运行起来就是一个进程,QQ可以聊天同时也可以传文件,聊天和传文件就是两个不同的线程。

软件必须运行起来才算进程。

对于同一个CPU来讲,在某一刻,只能执行一个线程,多个线程频发切换,给人一种多线程操作的假象。
多线程之间存在相互抢占CPU资源的情况。

创建线程的四种方式:
1、Thread 继承
2、实现Runnable 接口
3、Callable 接口
4、使用线程池
 

二.Thread继承

代码如下:

class MyThread extends Thread{
    // Ctrl + o
    // 展示所有的可以重写的方法
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println("数据:"+i);
        }
    }
}
public class _01继承Thread类{
    public static void main(String[] args) {
        // 在Main方法中,启动了一个子线程,子线程什么时候工作
        MyThread thread = new MyThread();
        thread.start();// 启动一个线程,调用start方法,不要调用run方法

        // 一个线程类,是可以创建多个不同的子线程的
        MyThread thread2 = new MyThread();
        thread2.start();// 启动一个线程,调用start方法,不要调用run方法

        // 主线程,直接运行代码   会出现子线程和主线程抢占资源的情况
        for (int i = 10; i < 100; i++) {

            System.err.println("Main:"+i);
        }

    }
}


运行结果:

三.实现Runnable接口

代码:

class A implements Runnable{
    @Override
    public void run() {
        for (int i = 0; i < 1000; i++) {
            System.out.println(Thread.currentThread().getName()+":"+i);
        }
    }
}
public class _02Runnable接口 {
    /**
     *  多线程创建的第二种方式,使用 Runnable接口
     *  该接口还需要传递给Thread类才能启动,否则自己启动不了
     *
     *  两种方式:推荐使用第二种
     *   1、Thread类是一个线程类,它只需要管理好线程就行了,不需要管业务怎么写
     *   2、具体的业务可以交给Runnable接口实现
     *   3、java是单继承的,继承了Thread,就无法继承别的类了,但是可以实现多个接口。
     */
    public static void main(String[] args) {
        A a = new A();
        new Thread(a).start();
        // Runnable接口本身就是一个函数式接口,就可以使用lambda表达式,代码可以简化为如下:
        new Thread( ()-> {
            for (int i = 0; i < 1000; i++) {
                System.out.println(Thread.currentThread().getName()+":"+i);
            }
        }).start();

        for (int i = 0; i < 1000; i++) {
            System.err.println(Thread.currentThread().getName()+":"+i);
        }
    }
}

运行结果:
 

四.Callable接口

代码:

class MyCall implements Callable<Integer>{

    @Override
    public Integer call() throws Exception {
        return 200;
    }
}

class MyRun implements Runnable{

    @Override
    public void run() {
        System.out.println("我是子线程....");
    }
}
public class _03Callable接口 {

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        FutureTask<Integer> futureTask = new FutureTask<>(new MyCall());
        new Thread(futureTask,"计算线程").start();
        Integer i = futureTask.get();
        System.out.println(i);
        // --------------------------------------
        new Thread(new MyRun()).start();
        // ------------------使用callable 模拟 子线程进行大量计算并返回结果------------------
        FutureTask<Integer> f1 = new FutureTask<>(
                ()->{
                    System.out.println(Thread.currentThread().getName()+"  come in callable");
                    TimeUnit.SECONDS.sleep(4);

                    return 1024;
                }
        );

        FutureTask<Integer> f2 = new FutureTask<>(
                ()->{
                    System.out.println(Thread.currentThread().getName()+"  come in callable");
                    TimeUnit.SECONDS.sleep(4);
                    return 2048;
                }
        );

        new Thread(f1,"线程一:").start();
        new Thread(f2,"线程二:").start();

        while(!f1.isDone()){
            System.out.println("f1  wait中.....");
        }
        while(!f2.isDone()){
            System.out.println("f2  wait中.....");
        }
        // 其实 get 获取不到值会一直阻塞,直到获取到值为止
        int a = f1.get();
        int b = f2.get();
        System.out.println(a+b);


    }
}

运行结果:
 

五.使用线程池

代码:

public class _04线程池 {

    public static void main(String[] args) {
        ExecutorService threadPool = new ThreadPoolExecutor(
                2,
                5,
                2L,
                TimeUnit.SECONDS,
                new ArrayBlockingQueue<Runnable>(3),
                Executors.defaultThreadFactory(),
                //new ThreadPoolExecutor.AbortPolicy()
                //new ThreadPoolExecutor.CallerRunsPolicy()
                //new ThreadPoolExecutor.DiscardOldestPolicy()
                new ThreadPoolExecutor.DiscardOldestPolicy()
        );
        //10个顾客请求
        try {
            for (int i = 1; i <= 10; i++) {
                threadPool.execute(() -> {
                    System.out.println(Thread.currentThread().getName() + "\t 办理业务");
                });
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            threadPool.shutdown();
        }

    }
}

运行结果:

标签:Java,Thread,System,回顾总结,线程,println,new,多线程,public
From: https://blog.csdn.net/yyzzyyds/article/details/143865592

相关文章

  • [Java] 获取操作系统类型
    需求描述在进行Java开发时,我们有时需要根据不同的操作系统执行不同的操作,例如在Windows系统下执行不同的命令,或者在Linux系统下调用不同的库函数。因此,判断当前运行的操作系统是十分重要的。此文将介绍如何使用Java判断当前操作系统,并给出相应的代码示例。代码示例OsUt......
  • ssm140基于java的奶茶店管理系统的设计与实现+jsp(论文+源码)_kaic
    毕业设计(论文)奶茶店管理系统 学   院                       专   业                       班   级                       学   号                   ......
  • JavaScript 字符串的常用方法有哪些
    速览JavaScript字符串的常用方法包括charAt、charCodeAt、concat、indexOf、lastIndexOf、slice、substring、toLowerCase、toUpperCase、trim、replace、split、padStart、padEnd等。详答1.基本信息JavaScript中的字符串是一种原始数据类型,提供了丰富的操作方法来处......
  • 【JAVA】Java基础—面向对象编程:类的其他特性—静态成员与方法
    在Java中,静态成员和静态方法是类的一部分,而不是类的实例的一部分。这意味着静态成员和方法可以在没有创建类的实例的情况下访问。理解静态成员和方法的概念对于Java开发至关重要,因为它们在内存管理、性能优化和设计模式中扮演着重要角色。理论知识1.静态成员静态变量:也称......
  • 【JAVA】Java基础—面向对象编程:类的其他特性—static 关键字的使用
    在Java编程中,static关键字是一个非常重要的概念,它用于定义类级别的成员,而不是实例级别的成员。理解static的使用对于编写高效、清晰和可维护的代码至关重要。在实际开发中,static关键字通常用于创建工具类、常量、单例模式以及共享数据等场景。理论知识1.static变量静态变......
  • Java基础知识(一)
    文章目录基础概念1.Java语言的特点2.JavaSEvsJavaEE3.JVMvsJDKvsJRE的区别a.JVMb.JDKc.JDEd.JDK、JRE和JVM的关系4.字节码5.Java语言“编译与解释并存”的特性6.AOT编译模式优势缺陷7.OracleJDKvsOpenJDK8.Java和C++的区别相同点:不同点......
  • Java学习之读取Yaml文件
    1.yaml文件示例:england:initialUrl:https://www.leisu.com/data/zuqiu/comp-82finalUrl:https://www.dszuqiu.com/league/35filePath:fileName:"英超.xlsx"spain:initialUrl:https://www.leisu.com/data/zuqiu/comp-120finalUrl:https://www.dszuqiu.......
  • Java 基础 -集合类
    集合类Java中重要的集合类有以下这些:集合类:Hashtable、HashMap、ArrayList、LinkedList、TreeMap、WeakHashMap1、ArrayListArrayList是一个有序数组,内部使用对象数组进行存储,并且有一个单独的size字段存储数组中对象的数量。transientObject[]elementData;privateint......
  • 【老白学 Java】休闲时刻 - 打造 CMD 战舰(三)
    休闲时刻-打造CMD战舰(三)文章来源:《HeadFirstJava》修炼感悟。上一篇,老白通过「硬编码」对战舰类的功能模块进行了简单测试。本篇的主要任务是继续完善战舰类并反复测试,其中涉及到几个新技术,师兄们如果感兴趣,请接着往下看。项目进度:列出必要的程序清单简单描......
  • [JavaScript]将数组按照parentId和id整理成树状结构
     JavaScriptfunctionarrayToTree(items){constrootItems=[];constlookup={};for(constitemofitems){constitemId=item.id;lookup[itemId]=item;constparentId=item.parentId;if(parentId===n......