多线程——Thread类
1、进程与线程:
(1)进程(Process):“正在执行的程序”,程序进入内存运行就变成了一个进程。一个进程会产生多个线程。
(2)多线程(Multithread):一个进程中同时存在几个执行体。单线程是按照函数的顺序执行,多线程是多段代码同时交替运行。CPU的一个核,在某一时刻只能执行一个线程,CPU在多个线程之间快速地切换。
(3)线程的调度:分时和抢占。分时调度是预先分配每个线程的时间。抢占式调度是按优先级。
(4)资源与调度
进程:
拥有资源的基本单位。
可独立调度和分派的基本单位。
线程:
线程本身拥有少量资源,它可以共享所属进程的资源。
独立运行和调度的基本单位。
(5)默认有两个进程:main进程和GC进程
2、多线程的实现
(1)方式一:继承Thread类
public class MyThread extends Thread{ //继承自Thread类
public MyThread(String name) { //调用父类的构造方法
super(name);
}
public void run() { //重写run方法,线程需要执行的代码放在run方法内
for (int i = ; i < ; i++) {
System.out.println(getName()+":正在执行!"+i);//Thread.currentThread().getName();获取当前线程对象的名称
}
}
}
public class Test {
public static void main(String[] args) {
MyThread mt = new MyThread("我的线程");
mt.start();
for (int i = ; i < ; i++) {
System.out.println("主函数线程!"+i);
}
System.out.println("主函数执行结束了");
}
}

由运行结果可知,两个线程的运行顺序由线程抢占到的CPU资源而定。
Thread.currentThread()获取当前线程对象
Thread.currentThread().getName();获取当前线程对象的名称
(2)方式二:实现Runable接口
以实现Runable接口的方式创建线程比继承Thread类有很大的优越性,因为类不能多重继承,即一个类只能继承一个类,那么如果该类已经继承了一个类,就不能实现多线程了,但是可以通过实现Runable接口的方式实现多线程。
Runnable实现多线程:
package pers.zhb.runnable;
public class MyThread implements Runnable{
public void run() {
for (int i = 0; i < 20; i++) {
System.out.println(Thread.currentThread().getName()+":正在执行!"+i);
}
}
}
package pers.zhb.runnable;
public class RunnableDemo {
public static void main(String[] args) {
MyThread mt=new MyThread();
Thread t2=new Thread(mt);//Thread类本质上也是实现了Runnable接口,但是Run方法是空的
t2.start();
for (int i = 0; i < 20; i++) {
System.out.println("主函数线程!"+i);
}
System.out.println("主函数执行结束了");
}
}
(3)join()方法的使用:
主线程在子线程运行结束后才开始运行。
package pers.zhb.runnable;
public class MyThread implements Runnable{
public void run() {
for (int i = 0; i < 20; i++) {
System.out.println(Thread.currentThread().getName()+":正在执行!"+i);
}
}
}
package pers.zhb.runnable;
public class RunnableDemo {
public static void main(String[] args) throws InterruptedException {
MyThread mt = new MyThread();
Thread t1 = new Thread(mt);
t1.start();
t1.join();
for (int i = 0; i < 20; i++) {
System.out.println("主函数线程!" + i);
}
System.out.println("主函数执行结束了");
}
}

3、线程池
我们用两种方式创建的线程,在使用后都会被销毁,频繁地创建和销毁会造成时间和资源的浪费。线程池是一个能够容纳多个线程的容器,里面的线程可以反复使用。
package pers.zhb.runnable;
public class MyThread implements Runnable {
public void run() {
System.out.println(Thread.currentThread().getName());
}
}
package pers.zhb.runnable; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; public class RunnableDemo {
public static void main(String[] args) throws InterruptedException {
ExecutorService es = Executors.newFixedThreadPool(3);//
// Executors:线程池创建工厂类,调用方法返回线程池对象 es.submit(new MyThread());
es.submit(new MyThread());
es.submit(new MyThread()); }
}

4、多线程的优点
(1)充分利用CPU资源
在单线程的程序中,如果线程被阻塞程序就不能执行,因为它们是顺序执行的;而在多线程程序中,如果一个线程被阻塞了别的线程就可以利用CPU资源。也就是说CPU一直处于忙碌的状态
(2)简化编程模型
手机游戏中既有背景音乐又有画面等功能,这些功能是并行的,如果利用单线程只能按照顺序执行,但是运用多线程的知识就可以很容易地实现
多线程——Thread类的更多相关文章
- 2.匿名类,匿名类对象,private/protected/public关键字、abstract抽象类,抽象方法、final关键字的使用,多线程Thread类start方法原理
package com.bawei.multithread; //注意:模板方法我们通常使用抽象类或者抽象方法!这里我们为了方便在本类中使用就没有使用抽象类/抽象方法 public class Tem ...
- 探Java多线程Thread类和Runnable接口之间的联系
首先复习一下Java多线程实现机制,Java实现多线程方法有如下这么几种: 1.继承了(extends)Thread类 2.实现了(implements)Runnable接口 也就是说 有如下两种情 ...
- 多线程----Thread类,Runnable接口,线程池,Callable接口,线程安全
1概念 1.1进程 进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能. 任务管理器中: 1.2线程 线程是进程中的一个执行单元 ...
- 多线程-----Thread类与Runnable接口的区别
第一个继承Thread类来实现多线程,其实是相当于拿出三件事即三个卖早餐10份的任务分别分给三个窗口,他们各做各的事各卖各的早餐各完成各的任务,因为MyThread继承Thread类,所以在newMy ...
- Java多线程Thread类了解和使用
创建线程的两种方式 extends Thread 类 public class WelComeApp { public static void main(String[] args) { Welcom ...
- 多线程Thread类的方法
创建多个线程的第一种方法 1.定义一个Thread类的子类,比如MyThread类 2.重写Thread的run方法,设置线程任务 3.创建Mythread类的对象 4.调用方法start(),开启新 ...
- Java多线程01(Thread类、线程创建、线程池)
Java多线程(Thread类.线程创建.线程池) 第一章 多线程 1.1 多线程介绍 1.1.1 基本概念 进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于 ...
- 多线程——继承Thread类实现一个多线程
继承Thread类实现一个多线程 Thread类部分源码: package java.lang; //该类实现了Runnable接口 public class Thread implements Ru ...
- 【C#多线程】1.Thread类的使用及注意要点
Thread随便讲讲 因为在C#中,Thread类在我们的新业务上并不常用了(因为创建一个新线程要比直接从线程池拿线程更加耗费资源),并且在.NET4.0后新增了Task类即Async与await关键 ...
随机推荐
- Console也要美颜了,来给Console添色彩
我们在开发过程中,经常需要将不同的信息用颜色标记出来,这可以让我们快速关注到重点信息.想必大家都知道,可以通过Console. ForegroundColor设置输出文字的颜色,背景颜色可以通过Con ...
- HTML基础介绍
前言: H5是目前行业里非常热门的一种语言,学习难度较低,可以快速入门.我个人也在学习H5,采用写博客的方式来梳理我学到的知识点,也分享给更多想学习的人一起来学习. Tip:个人学习过程中梳理的知识点 ...
- html利用j获取局域网内的本机IP(根据客户端浏览器的ip获取)
根据客户端浏览器的ip获取 <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type ...
- Flink快速入门--安装与示例运行
flink是一款开源的大数据流式处理框架,他可以同时批处理和流处理,具有容错性.高吞吐.低延迟等优势,本文简述flink在windows和linux中安装步骤,和示例程序的运行. 首先要想运行Flin ...
- C# 读取Word内容控件
在Word中,借助内容控件,可设计出具有特定功能的文档或模板.以下表格中简单介绍了几种常用的内容控件. 名称 简介 下拉列表内容控件 下拉列表包含了一个预先定义好的列表.和组合框不同的是下拉列表不允许 ...
- Liunx学习总结(七)--系统状态查看和统计
sar命令 sar 是一个非常强大的性能分析工具,它可以获取系统的 cpu/等待队列/磁盘IO/内存/网络等性能指标.功能多的必然结果是选项多,应用复杂,但只要知道一些常用的选项足以. 语法 sar ...
- FFmpeg命令行map参数选择音视频流
FFmpeg命令行map参数选择音视频流 介绍 -map参数告诉ffmpeg要从输入源中选择/拷贝哪个stream流到输出,可以从输入源中选择多个音视频流作为输出. 不加-map参数,ffmpeg默认 ...
- 「每日五分钟,玩转JVM」:对象从哪来
面向对象 众所周知,Java是一门面向对象的高级编程语言,那么现在问题来了,对象从哪来呢?有些人会说通过new关键字来创建一个对象,说的很好,本篇我们就来解密在new一个对象的过程中,JVM都给我们做 ...
- MongoDB的介绍安装与基本使用
MongoDB的介绍安装 关于MongoDB的介绍于安装可参考:https://www.cnblogs.com/DragonFire/p/9135630.html 除了官网下载,可以下载他人下载好分享 ...
- codeforces 822 D. My pretty girl Noora(dp+素数筛)
题目链接:http://codeforces.com/contest/822/problem/D 题解:做这题首先要推倒一下f(x)假设第各个阶段分成d1,d2,d3...di组取任意一组来说,如果第 ...