你的位置:首页 > Java教程

[Java教程]多线程入门

java多线程编程详细入门教程 - liuyuanq123的博客 - CSDN博客

线程是jvm调度的最小单元,也叫做轻量级进程,进程是由线程组成,线程拥有私有的程序技术器以及栈,并且能够访问堆中的共享资源亚洲城娱乐42188点com。这里提出一个问题,为什么...

多线程入门 - 自带锋芒 - 博客园

多线程入门 本次主要内容,主要是初步了解线程,创建线程,使用一些简单的API,多线程的五种状态博狗扑克haobc。 线程和进程 什么是线程?什么是进程?线程和进程的区别是...

Java 多线程入门 - 好好De活着 - 博客园

Java 多线程入门 进程与线程 在学习Java多线程之前,先简单复习一下进程与线程的知识易胜博亚洲首选288x。 进程:进程是系统进行资源分配和调度的基本单位,可以将进程理解...

Java多线程从入门到精通(一) - Dreaming_Joker的博客_CSDN博客

Java多线程简单入门本篇文章主要讲述Java多线程的基础入门知识,之后会陆续分享更深入的技术!一、两种创建线程的方法1、MyThread继承Thread类,然后重写...

Java多线程基础-使用多线程 - 简书

*本篇文章已授权微信公众号guolin_blog (郭霖)独家发布 线程:程序执行流的最小单元【可以理解为:进程中独立运行的子任务】万博宣伟公关公司。多线程优点:最大限度的利用CPU的空闲...

多线程基础知识总结_运行

线程:线程与进程相似,但线程是一个比进程更小的执行单位,一个进程在其执行的过程中可能产生多个线程万博亚洲app。 多进程:每个进程都拥有自己独立的资源,多个进程...

多线程学习怎样入门? - 知乎

写代码也有一些日子了,想学学多线程了,想问问操什么语言来起步比较好,c,c++,c#,还是java,具体的语…

C++多线程编程入门及范例详解_百度文库

29页 发布时间: 2018年06月27日

标签: 多线程编程| C++多线程编程入门及范例详解_计算机软件及应用_IT/计算机_专业资料10环网。介绍多线程编程方法,给出相应例程,并作出详细注解 ...

多线程基础-灰白色的世界-51CTO博客

进程和线程概念进程:资源分配的基本单位鸿运赌场。线程:独立调度的基本单位,一个进程中可以包含多个线程,它们之间共享进程资源,同一进程中线程切换不会引发进...

多线程之Task入门快速上手-C#.-苏飞论坛

7条回复nbsp;-nbsp;发帖时间:nbsp;2018年12月31日苏飞论坛?主页 ? 开发专区 ? C#. ? 多线程之Task入门快速上手 返回列表 查看: 1459|回复: 7 [Asp.] 多线程之Task入门快速上手 ...

JAVA从入门到精通之多线程详情

在JAVA从入门到精通中,首先了解线程的五大状态:新建,就绪,运行,阻塞,终结爱博。希望看完本文对大家学习JAVA从入门到精通有所帮助大赢家篮球比分。 1、新建状态(New):新创...

小例子带你入门多线程

GitChat 是一款基于微信平台的知识分享产品皇冠足球比分。通过这款产品我们希望改变IT知识的学习方式推荐足球。

java多线程详解(1)-多线程入门 | 易学教程

一.多线程的概念线程概念线程就是程序中单独顺序的流控制全讯直播网。线程本身不能运行,它只能用于程序中lovejet。说明:线程是程序内的顺序控制流,只能使用分配给程序的...

Java多线程基础知识(一) - 个人文章 - SegmentFault 思否

Java多线程一、Java线程模型实现线程有三种方式:使用内核线程实现、使用用户线程实现和使用用户线程加轻量级进程混合实现皇家88娱乐平台。内核线程是直接由操作系统...

多线程编程,线程基础操作,干货总结

多线程编程,线程基础操作,干货总结 隔壁老王聊程序 发布时间:09-2221:20 阅读本文你将学到如何使用C#创建线程,以及工作原理体育开户。 简介 过去普通计算机只有一个计算单元...

java多线程快速入门_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili

java多线程入门课程 后续课程会陆续发布 喜欢的关注下 点个收藏ヾ(?°?°?)ノ゛

并发与多线程基础看我就够啦_技术交流_牛客网

} 线程的生命周期这是一个面试常问的基础问题,你应该肯定的回答线程只有五种状态,分别是:新建状态、就绪状态、执行状态、阻塞状态、终止状态幸运28网站排行。就绪状...

Linux多线程编程入门指南_Linux - 实验楼

本课程将介绍线程相关的基础概念、高级话题以及同步和互斥三大主题,每个实验部分都通过一个实例学习Linux下的多线程编程相关技巧e彩在线。并通过实践的代码案例让大家对Linux多...

关于线程基础的问题-CSDN论坛

要学多线程 应付面试 :多线程几乎是面试中必问的题,所以掌握一定的基础知识是...前言:什么是线程?线程,有时被称为轻量进程(Lightweight Process,LWP),是程序...

多线程入门 - 网易云课堂

java作为企业级开发平台,多线程开发是企业器开发的重要基础 如想线下学习,北京名校保就业,联系我QQ:58 适用人群:有一定java基美国旅行美国旅行印度金三角旅游签证费用印度金三角旅游签证费用报团去印度金三角旅游报团去印度金三角旅游北京出发去塞舌尔旅游 北京出发去塞舌尔旅游 北京出发去塞舌尔旅游 北京出发去塞舌尔旅游 北京出发去塞舌尔旅游 北京出发去塞舌尔旅游 北京出发去三都岛旅游 北京出发去三都岛旅游 北京出发去三都岛旅游 北京出发去三都岛旅游 北京出发去三都岛旅游 北京出发去三都岛旅游 北京出发去沙特阿拉伯旅游 北京出发去沙特阿拉伯旅游 北京出发去沙特阿拉伯旅游 北京出发去沙特阿拉伯旅游 北京出发去沙特阿拉伯旅游 北京出发去沙特阿拉伯旅游 北京出发去设得兰群岛旅游 北京出发去设得兰群岛旅游 北京出发去设得兰群岛旅游 北京出发去设得兰群岛旅游 北京出发去设得兰群岛旅游 北京出发去设得兰群岛旅游

本次主要内容,主要是初步了解线程,创建线程,使用一些简单的API,多线程的五种状态线上娱乐05520永利。

 

线程和进程

什么是线程?什么是进程?线程和进程的区别是什么?(面试常问)

用例子说明:我们打开电脑,同时打开qq,网易云音乐,word多个软件,在任务管理器中就可以看到这些就是进程,进程是正在执行中的程序,我们在qq中,既可以给好友发信息,发文件,也可以接收信息,这些就是这个进程中的线程,线程是正在独立运行的一条执行路径,进程是线程的集合,一个操作系统可以有多个进程,一个进程有多个线程如意娱乐百度鼎盛彩票网。任何一个进程都有一个主线程,在Java中是main线程百家乐试玩。

为什么使用多线程?

百度网盘下载,我们可以同时下载多个文件,这多个文件是交给线程处理的,并且线程之间是互不影响的,不会因为一个出问题了,影响到其他文件的下载,提高程序的效率万博官网。

 

如何创建多线程

有几种方式?共有5种

在这里先介绍三种:

1、继承Thread类

2、实现Runnable接口

3、使用匿名内部类(可以算作一种)

另外两种后面深入再讲:

1、callable

2、使用线程池创建线程

 

01继承Thread类

class CreateThread1 extends Thread { @Override public void run() { for (int i = 0; i < 20; i++) {  System.out.println("run i:" + i); } }}public class Thread_Demo1 { public static void main(String[] args) { // 调用线程 CreateThread1 ct1 = new CreateThread1(); // 启动线程 ct1.start(); for (int i = 0; i < 30; i++) {  System.out.println("main i:" + i);//打印交替执行 } }}

 

继承Thread类创建线程,重写run方法,调用线程就是创建线程对象银河网站。怎么启动线程?不是直接对象名.run(),而是调用start方法来启动线程,如果调用run,就成了简单的调用一个普通的run方法金莎资料。一旦开启线程以后,代码的执行顺序不会在按照从上往下的顺序执行真钱二八杠19119澳门公司。执行顺序具有随机性大发体育。上面的代码运行一次的部分结果为:

main i:0
main i:1
run i:0
main i:2
run i:1
main i:3
run i:2
main i:4
run i:3
run i:4
main i:5

main是主线程,很容易的看出,多线程执行顺序不是从上而下的沙沙返利。

 

 

上图明显看出线程和多线程之间的区别,如果每个任务完成需要10秒,那么单线程下需要20秒,多线程下只需要10秒,单线程下如果任务1执行过程中出错了,那么整个程序就不会继续执行,多线程下互不影响国足直播cctv5。

这里,我们引出同步和异步的概念,同步就是代码从上往下顺序执行,是单线程的,异步就不是顺序执行,多线程,并且线程之间互不影响188体育。

 

02实现Runnable接口

class CreateThread2 implements Runnable{ @Override public void run() { for (int i = 0; i < 20; i++) {  System.out.println("run i:" + i); } }}public class Thread_Demo2 { public static void main(String[] args) { // 调用线程 CreateThread2 ct2 = new CreateThread2(); Thread t = new Thread(ct2);//别名 new Thread(ct2,"别名"); // 启动线程 t.start(); for (int i = 0; i < 30; i++) {  System.out.println("main i:" + i);//打印交替执行 } }}

 

源码中,Thread类是实现了Runnable接口的,我们需要先创建实现Runnable的对象,然后传给Thread,启动线程博狗网址q888.com。

对于这两种方法,是继承好还是实现接口好?

实现接口好,Java是单继承,多实现的面向对象编程语言,并且后面的开发都是面向接口编程,有利于代码的扩展与维护华体比分直播。

 

03匿名内部类创建线程

public class Thread_Demo3 { public static void main(String[] args) { Thread t = new Thread(new Runnable() {   @Override  public void run() {  for (int i = 0; i < 30; i++) {   System.out.println("run i:"+i);  }  } }); t.start(); for (int i = 0; i < 30; i++) {  System.out.println("main i:" + i);//打印交替执行 } }}

 

简单的API

1、start()    启动线程

2、currentThread()    获取当前线程对象

3、getID()    获取当前线程ID  Thread-编号,编号从0开始

4、getName()    获取当前线程名称

5、sleep()    线程休眠

6、stop()    停止线程(已过时,不建议使用)

这些大部分都是静态方法,可以直接Thread.进行调用皇冠体育在线官网。

class CreateT extends Thread { @Override public void run() { for (int i = 0; i < 20; i++) {  try {  Thread.sleep(1000);//休眠1000毫秒也就是1秒  } catch (InterruptedException e) {  // TODO Auto-generated catch block  e.printStackTrace();  }  System.out.println("线程ID:" + this.getId() + "子线程 i:" + i+"子线程name:"+this.getName());// 拿到线程ID,唯一,不会重复  //Thread.currentThread()获取当前线程  if(i==5){  //Thread.currentThread().stop();不安全,不建议使用,强制停止  } } }}public class ThreadAPI { public static void main(String[] args) { // 获取主线程ID System.out.println("主线程ID:" + Thread.currentThread().getId()+"主线程name:"+Thread.currentThread().getName()); for (int i = 0; i < 3; i++) {  CreateT t = new CreateT();  t.start(); }  CreateT t = new CreateT(); t.start(); }}

 

 守护线程和非守护线程

守护线程就是和main线程相关的,特征就是和主线程一起销毁,比如gc线程狗万app。

非守护线程特征就是和main线程互不影响,比如用户自己创建的用户线程,主线程停止掉,不会影响用户线程千亿国际娱乐。

 

下面这个例子,主线程执行完毕后,不会影响到子线程,子线程依然在执行澳门百家乐官网。

public class Demo4 { public static void main(String[] args) { Thread t = new Thread(new Runnable() {  @Override  public void run() {  for (int i = 0; i < 20; i++){  System.out.println("子线程 i:"+i);  }  } });  t.start(); for (int i = 0; i < 5; i++) {  System.out.println("主线程 i:"+i); } System.out.println("主线程执行完毕"); }}
 

使用下面这个方法:

setDaemon(true);//设置该线程为守护线程,和main线程一起挂掉

public class Demo4 {public static void main(String[] args) { Thread t = new Thread(new Runnable() { @Override public void run() {  for (int i = 0; i < 20; i++){  System.out.println("子线程 i:"+i);  } } }); t.setDaemon(true); t.start(); for (int i = 0; i < 5; i++) { System.out.println("主线程 i:"+i); } System.out.println("主线程执行完毕");}}

 

一次的执行结果

主线程 i:0
子线程 i:0
主线程 i:1
主线程 i:2
主线程 i:3
主线程 i:4
主线程执行完毕

主线程执行完毕后,子线程不会执行完毕,而是会随着主线程的停止就停止了银河网站。

join

join的作用就是让其他线程变为等待澳门百家乐怎么玩。

一个A线程,一个B线程,A线程调用B线程的join方法,那么A等待B执行完毕后,释放CPU执行权,再继续执行澳彩官网。

有这样一个题目:T1,T2,T3三个线程,怎么保证T2在T1完成后执行,T3在T2完成后执行???

在T3的run方法中调用T2的join方法,在T2的run方法中调用T1的join方法

public class Join_Test { public static void main(String[] args) { Thread T1 = new Thread(new Runnable() {  @Override  public void run() {  for (int i = 0; i < 5; i++){   System.out.println("T1");  }  } }); T1.start(); Thread T2 = new Thread(new Runnable() {  @Override  public void run() {  try {   T1.join();  } catch (InterruptedException e) {   // TODO Auto-generated catch block   e.printStackTrace();  }  for (int i = 0; i < 5; i++){   System.out.println("T2");  }  } }); T2.start(); Thread T3 = new Thread(new Runnable() {  @Override  public void run() {  try {   T2.join();  } catch (InterruptedException e) {   // TODO Auto-generated catch block   e.printStackTrace();  }  for (int i = 0; i < 5; i++){   System.out.println("T3");  }  } }); T3.start(); }}

线程的几种状态

线程共有5种状态uedbet赫塔菲官网。

新建状态,就绪状态,运行状态,阻塞状态,死亡状态manbetx体育。

 

新建状态:就是new创建一个线程,线程还没有开始运行全迅网。

就绪状态:新建状态的线程不会自动执行,要想执行线程,需要调用start方法启动线程,start线程创建线程运行的系统资源,并调度线程运行run方法,start方法返回后,就处于了就绪状态百家乐网址。就绪状态的线程不会立即运行run方法,需要获得CPU时间片后,才会运行乐8。

运行状态:获取CPU时间片,执行run方法65比分网。

阻塞状态:线程运行时,可能会有好多原因进入该状态,比如调用sleep方法休眠,I/O阻塞,线程想得到一个被其他线程正在持有的锁吉祥游戏下载。

死亡状态:正常退出而死亡,非正常退出而死亡(一个未捕获的异常终止了该线程)鸿运赌场。