Java | 多线程

线程与进程的区别

每个正在系统上运行的程序都是一个进程。每个进程包含一到多个线程。线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行。也可以把它理解为代码运行的上下文。所以线程基本上是轻量级的进程,它负责在单个程序里执行多任务。通常由操作系统负责多个线程的调度和执行。

使用线程可以把占据时间长的程序中的任务放到后台去处理,程序的运行速度可能加快,在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下可以释放一些珍贵资源如内存占用等等。

如果有大量的线程,会影响性能,因为操作系统需要在它们之间切换,更多的线程需要更多的内存空间,线程的中止需要考虑其对程序运行的影响。通常块模型数据是在多个线程间共享的,需要防止线程死锁情况的发生。

总结:进程是所有线程的集合,每一个线程是进程中的一条执行路径

为什么要使用多线程

思考生活问题

现在有一吨,也就是有1000千克的水,目前只有小明一个人去打水,但是小明每小时只能打水200千克,现在要求一小时内把水全部打完,请问怎么解决?

如果小明一个人将水全部打完需要五小时!

解决办法:

再加四个人同时打水,五个人每小时打水200千克,那么一小时后就可以完成一吨水!

总结:多线程的好处是提高程序效率

多线程应用场景

答:主要能体现到多线程提高程序效率
举例:迅雷多线程下载、分批发送短信等。

多线程创建方式

第一种继承Thread类 重写run方法
/**
 * @author Oh_MyBug
 * @date 2020/2/23
 */
class CreateThread extends Thread {
    /**
     * run方法执行 需要线程执行的任务、代码
     */
    public void run() {
        for (int i = 0; i < 100; i ++){
            System.out.println("run() i:" + i);
        }
    }
}

/**
 * @author Oh_MyBug
 * @date 2020/2/23
 */
public class ThreadDemo {

    public static void main(String[] args) {
        System.out.println("创建线程开始 main");
        // 1.定义一个类,继承Thread类 重写run方法
        // 2.如何启动线程?
        CreateThread createThread = new CreateThread();
        // 启动一个线程 是调用start方法 不是run方法,调用run方法相当于主线程执行
        // 注意 使用多线程情况,代码不会重写往下进行执行,会同时并行执行
        createThread.start();
        System.out.println("线程已经开始启动 main");
        for (int i = 0; i < 100; i ++){
            System.out.println("main() i:" + i);
        }
    }
}
Output
创建线程开始 main
线程已经开始启动 main
main() i:0
run() i:0
run() i:1
run() i:2
run() i:3
run() i:4
run() i:5
main() i:1
run() i:6
main() i:2
run() i:7
main() i:3
run() i:8
main() i:4
run() i:9
main() i:5
run() i:10
main() i:6
run() i:11
main() i:7
run() i:12
main() i:8
run() i:13
run() i:14
run() i:15
main() i:9
run() i:16
main() i:10
run() i:17
main() i:11
run() i:18
main() i:12
main() i:13
main() i:14
main() i:15
run() i:19
main() i:16
run() i:20
main() i:17
run() i:21
main() i:18
main() i:19
main() i:20
main() i:21
main() i:22
main() i:23
main() i:24
main() i:25
main() i:26
main() i:27
main() i:28
run() i:22
main() i:29
run() i:23
main() i:30
main() i:31
run() i:24
run() i:25
run() i:26
run() i:27
run() i:28
run() i:29
run() i:30
run() i:31
run() i:32
run() i:33
run() i:34
run() i:35
run() i:36
run() i:37
run() i:38
run() i:39
run() i:40
run() i:41
run() i:42
run() i:43
run() i:44
run() i:45
run() i:46
run() i:47
run() i:48
run() i:49
run() i:50
run() i:51
run() i:52
run() i:53
run() i:54
run() i:55
run() i:56
run() i:57
run() i:58
run() i:59
run() i:60
run() i:61
run() i:62
run() i:63
run() i:64
run() i:65
run() i:66
run() i:67
run() i:68
run() i:69
run() i:70
run() i:71
run() i:72
run() i:73
run() i:74
run() i:75
run() i:76
run() i:77
run() i:78
run() i:79
run() i:80
run() i:81
run() i:82
run() i:83
run() i:84
run() i:85
run() i:86
run() i:87
run() i:88
run() i:89
run() i:90
run() i:91
run() i:92
run() i:93
run() i:94
run() i:95
run() i:96
run() i:97
run() i:98
run() i:99
main() i:32
main() i:33
main() i:34
main() i:35
main() i:36
main() i:37
main() i:38
main() i:39
main() i:40
main() i:41
main() i:42
main() i:43
main() i:44
main() i:45
main() i:46
main() i:47
main() i:48
main() i:49
main() i:50
main() i:51
main() i:52
main() i:53
main() i:54
main() i:55
main() i:56
main() i:57
main() i:58
main() i:59
main() i:60
main() i:61
main() i:62
main() i:63
main() i:64
main() i:65
main() i:66
main() i:67
main() i:68
main() i:69
main() i:70
main() i:71
main() i:72
main() i:73
main() i:74
main() i:75
main() i:76
main() i:77
main() i:78
main() i:79
main() i:80
main() i:81
main() i:82
main() i:83
main() i:84
main() i:85
main() i:86
main() i:87
main() i:88
main() i:89
main() i:90
main() i:91
main() i:92
main() i:93
main() i:94
main() i:95
main() i:96
main() i:97
main() i:98
main() i:99
第二种实现Runnable接口,重写run方法
/**
 * @author Oh_MyBug
 * @date 2020/2/23
 */

class CreateRunnable implements Runnable {

    /**
     * run方法执行 需要线程执行的任务、代码
     */
    @Override
    public void run() {
        for (int i = 0; i < 100; i ++){
            System.out.println("run() i:" + i);
        }
    }
}
public class ThreadDemo2 {

    public static void main(String[] args) {
        // 第一个类,实现Runnable接口 重写run方法
        System.out.println("创建线程开始 main");
        CreateRunnable createRunnable = new CreateRunnable();
        Thread thread = new Thread(createRunnable);
        thread.start();
        System.out.println("线程已经启动 main");
        for (int i = 0; i < 100; i ++){
            System.out.println("main() i:" + i);
        }
    }
}
Output
创建线程开始 main
线程已经启动 main
main() i:0
main() i:1
main() i:2
main() i:3
run() i:0
run() i:1
run() i:2
run() i:3
run() i:4
run() i:5
run() i:6
run() i:7
run() i:8
run() i:9
run() i:10
run() i:11
run() i:12
run() i:13
run() i:14
run() i:15
run() i:16
run() i:17
run() i:18
run() i:19
run() i:20
run() i:21
run() i:22
run() i:23
run() i:24
run() i:25
run() i:26
run() i:27
run() i:28
run() i:29
run() i:30
run() i:31
run() i:32
run() i:33
run() i:34
run() i:35
run() i:36
run() i:37
run() i:38
run() i:39
run() i:40
run() i:41
run() i:42
run() i:43
run() i:44
run() i:45
run() i:46
run() i:47
main() i:4
run() i:48
run() i:49
run() i:50
run() i:51
run() i:52
run() i:53
run() i:54
run() i:55
run() i:56
run() i:57
run() i:58
run() i:59
run() i:60
run() i:61
run() i:62
run() i:63
run() i:64
run() i:65
run() i:66
run() i:67
run() i:68
main() i:5
run() i:69
run() i:70
main() i:6
run() i:71
run() i:72
run() i:73
run() i:74
run() i:75
run() i:76
run() i:77
run() i:78
run() i:79
main() i:7
run() i:80
main() i:8
run() i:81
main() i:9
run() i:82
main() i:10
run() i:83
main() i:11
run() i:84
main() i:12
run() i:85
run() i:86
run() i:87
run() i:88
run() i:89
run() i:90
run() i:91
run() i:92
main() i:13
run() i:93
main() i:14
run() i:94
main() i:15
run() i:95
run() i:96
run() i:97
run() i:98
run() i:99
main() i:16
main() i:17
main() i:18
main() i:19
main() i:20
main() i:21
main() i:22
main() i:23
main() i:24
main() i:25
main() i:26
main() i:27
main() i:28
main() i:29
main() i:30
main() i:31
main() i:32
main() i:33
main() i:34
main() i:35
main() i:36
main() i:37
main() i:38
main() i:39
main() i:40
main() i:41
main() i:42
main() i:43
main() i:44
main() i:45
main() i:46
main() i:47
main() i:48
main() i:49
main() i:50
main() i:51
main() i:52
main() i:53
main() i:54
main() i:55
main() i:56
main() i:57
main() i:58
main() i:59
main() i:60
main() i:61
main() i:62
main() i:63
main() i:64
main() i:65
main() i:66
main() i:67
main() i:68
main() i:69
main() i:70
main() i:71
main() i:72
main() i:73
main() i:74
main() i:75
main() i:76
main() i:77
main() i:78
main() i:79
main() i:80
main() i:81
main() i:82
main() i:83
main() i:84
main() i:85
main() i:86
main() i:87
main() i:88
main() i:89
main() i:90
main() i:91
main() i:92
main() i:93
main() i:94
main() i:95
main() i:96
main() i:97
main() i:98
main() i:99
第三种使用匿名内部类方式
/**
 * ClassName: ThreadDemo3
 * Function:  TODO
 * Date:      2020/2/23 4:44
 * author:    Oh_MyBug
 * version:   V1.0
 */

/**
 * ClassName: ThreadDemo3
 * Date:      2020/2/23 4:44
 * author:    Oh_MyBug
 * version:   V1.0
 */
public class ThreadDemo3 {

    public static void main(String[] args) {
        System.out.println("创建线程成功!");
        // 使用匿名内部类方式创建线程
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 100; i ++){
                    System.out.println("run() i:" + i);
                }
            }
        });
        System.out.println("创建线程结束");
        thread.start();
        for (int i = 0; i < 100; i ++){
            System.out.println("main() i:" + i);
        }
    }
}
Output
创建线程成功!
创建线程结束
main() i:0
main() i:1
main() i:2
main() i:3
main() i:4
run() i:0
run() i:1
run() i:2
run() i:3
run() i:4
run() i:5
run() i:6
run() i:7
run() i:8
run() i:9
run() i:10
run() i:11
run() i:12
run() i:13
run() i:14
run() i:15
main() i:5
run() i:16
run() i:17
run() i:18
run() i:19
run() i:20
run() i:21
run() i:22
main() i:6
run() i:23
run() i:24
run() i:25
main() i:7
run() i:26
main() i:8
run() i:27
main() i:9
run() i:28
main() i:10
run() i:29
main() i:11
run() i:30
main() i:12
run() i:31
main() i:13
run() i:32
main() i:14
run() i:33
main() i:15
run() i:34
main() i:16
run() i:35
main() i:17
run() i:36
run() i:37
run() i:38
run() i:39
run() i:40
run() i:41
run() i:42
run() i:43
run() i:44
run() i:45
run() i:46
run() i:47
run() i:48
run() i:49
run() i:50
run() i:51
run() i:52
run() i:53
run() i:54
run() i:55
run() i:56
run() i:57
main() i:18
main() i:19
main() i:20
main() i:21
main() i:22
main() i:23
main() i:24
main() i:25
main() i:26
main() i:27
main() i:28
main() i:29
main() i:30
main() i:31
main() i:32
main() i:33
main() i:34
main() i:35
main() i:36
main() i:37
main() i:38
main() i:39
main() i:40
main() i:41
main() i:42
main() i:43
run() i:58
main() i:44
run() i:59
main() i:45
run() i:60
main() i:46
run() i:61
run() i:62
main() i:47
run() i:63
run() i:64
run() i:65
run() i:66
run() i:67
run() i:68
run() i:69
run() i:70
run() i:71
run() i:72
run() i:73
run() i:74
run() i:75
run() i:76
run() i:77
run() i:78
run() i:79
run() i:80
run() i:81
run() i:82
run() i:83
run() i:84
run() i:85
run() i:86
run() i:87
run() i:88
run() i:89
run() i:90
run() i:91
run() i:92
run() i:93
run() i:94
run() i:95
run() i:96
run() i:97
run() i:98
run() i:99
main() i:48
main() i:49
main() i:50
main() i:51
main() i:52
main() i:53
main() i:54
main() i:55
main() i:56
main() i:57
main() i:58
main() i:59
main() i:60
main() i:61
main() i:62
main() i:63
main() i:64
main() i:65
main() i:66
main() i:67
main() i:68
main() i:69
main() i:70
main() i:71
main() i:72
main() i:73
main() i:74
main() i:75
main() i:76
main() i:77
main() i:78
main() i:79
main() i:80
main() i:81
main() i:82
main() i:83
main() i:84
main() i:85
main() i:86
main() i:87
main() i:88
main() i:89
main() i:90
main() i:91
main() i:92
main() i:93
main() i:94
main() i:95
main() i:96
main() i:97
main() i:98
main() i:99
使用继承Thread类还是使用实现Runnable接口好?

:使用实现Runnable接口好,原因实现了接口还可以继续继承,继承了类不能再继承。

启动线程是使用调用start方法还是run方法?

开始执行线程 注意 开启线程不是调用run方法,而是start方法。

调用run只是使用实例调用方法。

获取线程对象以及名称

常用API方法作用
start()启动线程
currentThread获取当前线程对象
getID()获取当前线程对象
getName()获取当前线程名称
sleep(long mill)休眠线程
Stop()停止线程
常用线程构造函数作用
Thread()分配一个新的Thread对象
Thread(String name)分配一个新的Thread对象,具有指定的name 正如其名
Thread(Runnable r)分配一个新的Thread对象
Thread(Runnable r,String name)分配一个新的Thread对象
sleep方法
/**
 * @Class:       TODO
 * @author:      Oh_MyBug
 * @Date:        2020/2/23 5:07
 */
class DemoThread extends Thread {

    // 在run方法中不能抛出异常,只能try
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            // sleep 是毫秒
            try {
                // sleep作用让当前线程从运行状态变为休眠状态,如果时间到期,再次变为运行状态
                // sleep不能释放锁,wait可以释放锁
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("i:"+i);
        }
    }
}
/**
 * ClassName: ThreadDemo4
 * Date:      2020/2/23 5:06
 * author:    Oh_MyBug
 * version:   V1.0
 */
public class ThreadDemo4 {
    public static void main(String[] args) {
        new DemoThread().start();
    }
}
Output
i:0
i:1
i:2
i:3
i:4
i:5
i:6
i:7
i:8
i:9
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值