IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 多线程学习 -> 正文阅读

[Java知识库]多线程学习

? 多线程的创建方式有三种


实现方式一继承Thread类

首先创建线程类 继承Thread

public class MyThread extends Thread{//继承Thread

    //重写run方法 方法里面是我们要做的事情
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println("子线程运行:"+i);
        }
    }
}

创建测试类 并在主线程下启动子线程 调用

myThread.start();方法

代码

public class ThreadDemo {
    public static void main(String[] args) {
        //创建线程对象
        MyThread myThread = new MyThread();
        //启动子线程
        myThread.start();

        //主线程需要做的事情
        for (int i = 0; i < 10; i++) {
            System.out.println("主线程:"+i);
        }
/* 结果  子线程和主线程在同运行 有先有后 不一定是谁先谁后
主线程:0
主线程:1
子线程运行:0
主线程:2
子线程运行:1
子线程运行:2
子线程运行:3
子线程运行:4
主线程:3
子线程运行:5
子线程运行:6
子线程运行:7
子线程运行:8
子线程运行:9
主线程:4
主线程:5
主线程:6
主线程:7
主线程:8
主线程:9

Process finished with exit code 0

 */
    }
}


?实现方式二 实现Runnable接口

?创建任务类 实现Runnable接口

/**
 实现方式二 实现Runnable接口
 */
public class MyRunnable implements Runnable{

    //创建任务
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println("子线程运行:"+i);
        }
    }
}

?创建测试类

public class RunnableDemo {
    public static void main(String[] args) {
        //创建任务对象 不是创建线程对象
        MyRunnable myRunnable = new MyRunnable();

        //把任务转换成线程
        Thread thread = new Thread(myRunnable);
        thread.start();

        for (int i = 0; i < 10; i++) {
            System.out.println("主线程运行:"+i);
        }
    }
}

匿名内部类写法?

方式一?

/*
匿名内部类写法
 */
public class RunnableDemo {
    public static void main(String[] args) {
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 200; i++) {
                    System.out.println("内部类 子线程:"+i);
                }
            }
        };
        //启动线程
        new Thread(runnable).start();


        for (int i = 0; i < 150; i++) {
            System.out.println("主线程:+i");
        }
    }
}

因为Runnable接口是函数式接口 只有一个抽象方法

所有就可以用lambda表达式来简化写法

方式二

public class RunnableDemo02 {
    /*
    匿名内部类可以用lambda表达式简化
     */
    public static void main(String[] args) {
        Runnable runnable =()-> {
            for (int i = 0; i < 100; i++) {
                System.out.println("lambda表达式"+i);
            }
        };

        //任务对象转换成多线程启动类对象
        new Thread(runnable).start();

        for (int i = 0; i < 100; i++) {
            System.out.println("主线程"+i);
        }
    }
}

最简化版

public class RunnableDemo03 {
    /*
    最终简化
     */
    public static void main(String[] args) {

        new Thread(()-> {
            for (int i = 0; i < 100; i++) {
                System.out.println("最终简化实现"+i);
            }
        }).start();//启动线程

        //主线程类
        for (int i = 0; i < 100; i++) {
            System.out.println("主线程"+i);
        }
    }
}

创建方式三

创建任务对象

public class MyCallable implements Callable<String> {
    @Override
    public String call() throws Exception {
        return "牛逼";
    }
}

?测试

public class CallableDemo {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        MyCallable myCallable = new MyCallable();

        //把他封装成任务对象 FutureTask 是实现Runnable接口的 所有用它来封装Callable接口
        //用他来得到返回结果
        FutureTask<String> stringFutureTask = new FutureTask<String>(myCallable);

        //封装成线程对象
        new Thread(stringFutureTask).start();

        //拿到结果对象
        System.out.println(stringFutureTask.get());
    }
}

?总结

?Thread常用API

给多个线程取名字

设定线程任务

public class MyThread extends Thread{
    public MyThread() {
    }

    public MyThread(String name) {
        super(name);
    }

    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println(Thread.currentThread().getName()+i);//currentThread().getName() 得到当前线程名字
        }
    }
}

方式一 通过setName方法设定名字

public class ThreadDemo {
    public static void main(String[] args) {
        Thread thread = new Thread(new MyThread());
        thread.setName("1号线程");
        thread.start();

        Thread thread2 = new Thread(new MyThread());
        thread2.setName("2号线程");
        thread2.start();


        for (int i = 0; i < 5; i++) {
            System.out.println("main线程"+i);
        }
    }
}

?方式二通过构造器来取名字

public class ThreadDemo01 {
    public static void main(String[] args) {
        //通过构造器注入名字
        new MyThread("一号线程").start();
        new MyThread("二号线程").start();
        new MyThread("三号线程").start();

        for (int i = 0; i < 5; i++) {
            System.out.println("main线程" + i);
        }
    }
}

线程的休眠方法 sleep

? 代码

public class ThreadDemo02 extends Thread{
    @SneakyThrows//异常注解
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println(i);
            if (i==4){
                Thread.sleep(3000);//休息三秒
            }
        }
    }

    public static void main(String[] args) {

        ThreadDemo02 threadDemo02 = new ThreadDemo02();
        threadDemo02.start();

    }
}

总结

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-02-16 12:56:41  更:2022-02-16 12:58:23 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 12:50:31-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码