多线程——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关键 ...
随机推荐
- 本地在不安装Oracle的情况下安装PLSQL客户端
本文解决问题: 通常在本地安装PLSQL后,如果本地没有安装Oracle数据库的话,PLSQL是不能使用的,输入远程数据库登录信息会提示:"Oracle Client没有正确安装&quo ...
- Sqlserver 游标的写法记录
---游标更新删除当前数据 ---1.声明游标 declare orderNum_03_cursor cursor scroll for select OrderId ,userId from big ...
- Java连载21-switch练习
一.switch练习 public class d21_{ public static void main(String[] args) { java.util.Scanner s = new jav ...
- 【MySQL】索引
什么是索引 索引就好比是书的目录,可以显著提高数据库查询的效率.例如像一本很厚的书,在没有目录的情况下要查到你想要看的知识点,都不知要找到什么时候,但通过目录我们可以很快的查询到对应的内容. 索引的数 ...
- UnityScript基础
基本格式 1 cc.Class({ 2 extends: cc.Component, 3 4 properties: { 5 }, 6 7 // use this for initialization ...
- C#数据结构_栈和队列
栈:先进后出,只能在栈顶进行操作. 栈的操作主要包括在栈顶插入元素和删除元素.取栈顶元素和判断栈是否为空等. 栈的接口定义: public interface IStack<T> { in ...
- Delphi - cxGrid添加Footer显示
cxGrid - 添加footer显示 1:添加Footer Items 单击cxGrid Customize... ,Summary,Add: 2:添加Footer items数据绑定 选中一条需要 ...
- 超越Storm,SparkStreaming——Flink如何实现有状态的计算
流式计算分为无状态和有状态两种情况.无状态计算观察每个独立的事件,Storm就是无状态的计算框架,每一条消息来了以后和前后都没有关系,一条是一条.比如我们接收电力系统传感器的数据,当电压超过240v就 ...
- ElementUI使用v-if控制tab标签显示遇到的Duplicate keys detected: 'xxx'问题
今天工作遇到一个问题: 需求背景:页面中有几个tab,需要根据登录用户的权限控制tab标签的显示与隐藏 . <el-tabs @tab-click="handleClick" ...
- hdu-6638 Snowy Smile
题目链接 Snowy Smile Problem Description There are n pirate chests buried in Byteland, labeled by 1,2,-, ...