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类的更多相关文章

  1. 2.匿名类,匿名类对象,private/protected/public关键字、abstract抽象类,抽象方法、final关键字的使用,多线程Thread类start方法原理

    package com.bawei.multithread; //注意:模板方法我们通常使用抽象类或者抽象方法!这里我们为了方便在本类中使用就没有使用抽象类/抽象方法 public class Tem ...

  2. 探Java多线程Thread类和Runnable接口之间的联系

    首先复习一下Java多线程实现机制,Java实现多线程方法有如下这么几种: 1.继承了(extends)Thread类 2.实现了(implements)Runnable接口 也就是说  有如下两种情 ...

  3. 多线程----Thread类,Runnable接口,线程池,Callable接口,线程安全

    1概念 1.1进程 进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能. 任务管理器中: 1.2线程 线程是进程中的一个执行单元 ...

  4. 多线程-----Thread类与Runnable接口的区别

    第一个继承Thread类来实现多线程,其实是相当于拿出三件事即三个卖早餐10份的任务分别分给三个窗口,他们各做各的事各卖各的早餐各完成各的任务,因为MyThread继承Thread类,所以在newMy ...

  5. Java多线程Thread类了解和使用

    创建线程的两种方式 extends Thread 类 public class WelComeApp { public static void main(String[] args) { Welcom ...

  6. 多线程Thread类的方法

    创建多个线程的第一种方法 1.定义一个Thread类的子类,比如MyThread类 2.重写Thread的run方法,设置线程任务 3.创建Mythread类的对象 4.调用方法start(),开启新 ...

  7. Java多线程01(Thread类、线程创建、线程池)

    Java多线程(Thread类.线程创建.线程池) 第一章 多线程 1.1 多线程介绍 1.1.1 基本概念 进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于 ...

  8. 多线程——继承Thread类实现一个多线程

    继承Thread类实现一个多线程 Thread类部分源码: package java.lang; //该类实现了Runnable接口 public class Thread implements Ru ...

  9. 【C#多线程】1.Thread类的使用及注意要点

    Thread随便讲讲 因为在C#中,Thread类在我们的新业务上并不常用了(因为创建一个新线程要比直接从线程池拿线程更加耗费资源),并且在.NET4.0后新增了Task类即Async与await关键 ...

随机推荐

  1. CodeForces 427D Match & Catch

    洛谷题目页面传送门 & CodeForces题目页面传送门 给定\(2\)个字符串\(a,b,|a|=n,|b|=m\),求最长的既在\(a\)中出现恰好\(1\)次又在\(b\)中出现恰好\ ...

  2. .net软件开发脚本规范-SVN标准

    一. SVN标准 1) 提交代码前先获取最新代码 2) 提交时需要填写信息,填写任务Excel中的修改内容列,如以下任务填写“业绩考核-工作量管理”,如果发生修改再次提交,在其后加上修改原因,例“业绩 ...

  3. 基于注解的SpringAOP源码解析(三)

    注意,读完本篇文章需要很长很长时间 在之前的2篇文章:AOP源码分析(一)AOP源码分析(二) 中,我们搭建了SpringAOP源码分析的环境,介绍了@EnableAspectJAutoProxy注解 ...

  4. Spring Boot 默认指标从哪来?

    了解有关 Spring Boot 默认指标及其来源的更多信息. 您是否注意到 Spring Boot 和 Micrometer 为您的应用生成的所有默认指标? 如果没有 - 您可以将 actuator ...

  5. ionic $ioniActionSheet 在安卓手机没样式

    解决方法: 添加以下修复css样式 /** * Action Sheets for Android * ------------------------------------------------ ...

  6. EF-运行原理

    一.什么是EF? 实体架构(Entity Framework)是微软以来ADO.Net为基础开发出来的对象关系映射(ORM)解决方案,它解决了对象持久化问题,将程序员从编写麻烦的SQL语句中解放出来. ...

  7. lua_基本语法

    学习lua,首先应该了解热更新. 热更新:可以在不重新下载客户端的情况下更新软件内容.在使用软件过程中,我们经常会遇到这种情况:升级软件,没错,这就使用的是热更新. C#不能直接热更新,原因为:C#脚 ...

  8. Web安全开发规范手册V1.0

    一.背景 团队最近频繁遭受网络攻击,引起了部门技术负责人的重视,笔者在团队中相对来说更懂安全,因此花了点时间编辑了一份安全开发自检清单,觉得应该也有不少读者有需要,所以将其分享出来. 二.自检清单 检 ...

  9. Storm 系列(八)—— Storm 集成 HDFS 和 HBase

    一.Storm集成HDFS 1.1 项目结构 本用例源码下载地址:storm-hdfs-integration 1.2 项目主要依赖 项目主要依赖如下,有两个地方需要注意: 这里由于我服务器上安装的是 ...

  10. 在IIS下部署PHP

    没有.net ramework 4.0 的要先安装 dotNetFx40_Full_x86_x64.exe PHP压缩包 推荐用5.6.29版 IIS下PHP压缩包下载地址:"http:// ...