java多线程

进程与线程

进程:指一个正在执行的应用程序。每个进程执行都有一个执行顺序,该顺序称为一个执行路径或一个控制单元(进程是资源分配的最小单位)。一个进程包含1~n个线程

线程:指进程中某个单一顺序的控制流。线程控制着进程的执行(线程是CPU调度的最小单位)

多进程:指操作系统能同时运行多个任务(程序)
多线程:指在同一程序中有多个顺序流在执行

实现java多线程

在java中要实现多线程,有两种方式,一种是继承Thread类,一种是实现Runable接口

方式一:继承Thread类并复写run方法

步骤:

  • 自定义类继承Thread类
  • 在自定义类中复写Thread类中的run()方法(目的:将自定义代码存储在run方法中,让线程运行)
  • 创建类对象
  • 调用线程start方法(方法有两作用:启动线程,调用run方法

例1:

//自定义Demo类继承Thread类
class Demo extends Thread{
//复写run()方法
public void run(){
for(int i=;i<;i++){
System.out.println("Demo run"+"--"+i);
}
} } public class ThreadDemo{
public static void main(String[] args){
//创建线程Demo的线程对象
Demo d = new Demo();
//启动线程并执行该线程的run()方法
//若是d.run()仅仅是对象调用run方法,而线程创建了并未运行
d.start();
for(int i =;i<;i++){
System.out.println("wujiadong"+"--"+i);
}
} }

运行结果:

wujiadong--1
wujiadong--2
wujiadong--3
wujiadong--4
wujiadong--5
wujiadong--6
wujiadong--7
wujiadong--8
wujiadong--9
Demo run--1
Demo run--2
Demo run--3
Demo run--4
Demo run--5
Demo run--6
Demo run--7
Demo run--8
Demo run--9
Demo run--10
Demo run--11
Demo run--12
Demo run--13
Demo run--14
Demo run--15
Demo run--16
Demo run--17
Demo run--18
Demo run--19

方式二:实现Runnable接口

步骤:

  • 定义类实现Runnable接口
  • 覆盖Runnable接口中的run方法
  • 创建Runnable接口的子类对象
  • 创建Thread类对象,并把Runnable接口的子类对象作为构造参数传递
  • 调用Thread类start方法开启线程并调用Runnable接口子类的run方法

例1:

class MyRunnable implements Runnable{
public void run(){
for(int i = ;i<;i++){
System.out.println(Thread.currentThread().getName()+"--"+i);
}
} } public class Example1{
public static void main(String[] arags){
MyRunnable mr = new MyRunnable();
/*
//创建线程
Thread t1 = new Thread(mr);
Thread t2 = new Thread(mr);
//设置线程名称(推荐这种命名方法)
t1.setName("wujiadong");
t2.setName("jiangrui");
*/
//第二种线程命名方法
Thread t1 = new Thread(mr,"wujiadong");
Thread t2 = new Thread(mr,"jiangrui");
t1.start();
t2.start();
} }

Thread和Runnable的区别

  • 继承Thread:线程代码存放在Thread子类run方法中
  • 实现Runnable:线程代码存放在接口子类的run方法中

实现Runnable接口相对于继承Thread类的优点:

  • 可共享一个目标对象,实现多个线程处理同一个资源
  • 可避免java单线程的限制

线程的生命周期

  • 新建状态(New): 创建线程对象就绪状态(Runnable):  线程对象创建后,其他线程调用该对象的start方法,该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。即有执行资格无执行权
  • 运行状态(Running):  就绪状态的线程获取了CPU,执行程序代码。即有执行资格,有执行权
  • 堵塞状态(Blocked):  因为某种原因放弃CPU使用权,暂时停止运行。知道线程进入就绪状态,才有机会转到运行状态。即无执行资格无执行权
  • 死亡状态(Terminated):线程执行完了或因异常退出了run()方法,该线程结束生命周期

线程调度

  • 线程优先级
  • 线程休眠
  • 线程让步
  • 线程插队

线程优先级

lass ThreadPriority extends Thread{
public void run(){
for(int i =;i<;i++){
System.out.println(Thread.currentThread().getName()+"--"+i);
}
}
} public class Example13{
public static void main(String[] args){
ThreadPriority tp1 = new ThreadPriority();
ThreadPriority tp2 = new ThreadPriority();
ThreadPriority tp3 = new ThreadPriority();
tp1.setName("线程a");
tp2.setName("线程b");
tp3.setName("线程c"); //System.out.println(tp1.getPriority());获取默认的优先级
//设置优先级
tp1.setPriority();
tp2.setPriority();
tp3.setPriority(); tp1.start();
tp2.start();
tp3.start();
}
}

线程休眠

import java.util.Date;
class MyThread extends Thread{
public void run(){
for(int i = ;i<;i++){
System.out.println(Thread.currentThread().getName()+"---"+i+",日期"+new Date());
try{
Thread.sleep();
}catch(InterruptedException e){
e.printStackTrace();
} } }
} public class Example14{
public static void main(String[] args){
MyThread mt1 = new MyThread();
MyThread mt2 = new MyThread();
MyThread mt3 = new MyThread(); mt1.setName("邬家栋");
mt2.setName("江睿");
mt3.setName("徐晴玉"); mt1.start();
mt2.start();
mt3.start();
}
} /*
上面代码需注意捕获异常或抛出异常 部分运行结果
邬家栋---0,日期Mon Oct 17 04:36:19 PDT 2016
江睿---0,日期Mon Oct 17 04:36:19 PDT 2016
徐晴玉---0,日期Mon Oct 17 04:36:19 PDT 2016
邬家栋---1,日期Mon Oct 17 04:36:20 PDT 2016
江睿---1,日期Mon Oct 17 04:36:20 PDT 2016
徐晴玉---1,日期Mon Oct 17 04:36:20 PDT 2016
江睿---2,日期Mon Oct 17 04:36:21 PDT 2016
徐晴玉---2,日期Mon Oct 17 04:36:21 PDT 2016
邬家栋---2,日期Mon Oct 17 04:36:21 PDT 2016 */

线程让步

class MyThread extends Thread{
public void run(){
for(int i = ;i<;i++){
System.out.println(Thread.currentThread().getName()+"--"+i);
Thread.yield();//暂停当前线程,并执行其他线程
} }
} public class Example16{
public static void main(String[] args){
MyThread mt1 = new MyThread();
MyThread mt2 = new MyThread(); mt1.setName("wujiadong");
mt2.setName("jiangrui"); mt1.start();
mt2.start(); }
} /*
部分结果
...
wujiadong--41
jiangrui--30
wujiadong--42
jiangrui--31
wujiadong--43
jiangrui--32
wujiadong--44
... */

线程插队

class MyThread extends Thread{
public void run(){
for(int i=;i<;i++){
System.out.println(Thread.currentThread().getName()+"--"+i);
}
} } public class Example15{
public static void main(String[] args){
MyThread mt1 = new MyThread();
MyThread mt2 = new MyThread();
MyThread mt3 = new MyThread(); mt1.setName("wujiadong");
mt2.setName("jiangrui");
mt3.setName("sunqiangkun"); //加入join后等mt1线程运行完才开始运行mt2和mt3
mt1.start();
try{
mt1.join();
}catch(InterruptedException e){
e.printStackTrace();
}
mt2.start();
mt3.start();
}
} /*
部分运行结果
...
wujiadong--47
wujiadong--48
wujiadong--49
jiangrui--0
jiangrui--1
jiangrui--2
...
jiangrui--8
jiangrui--9
jiangrui--10
jiangrui--11
jiangrui--12
... */

守护线程

class MyThread extends Thread{
public void run(){
for(int i = ;i<;i++){
System.out.println(Thread.currentThread().getName()+"---"+i);
}
}
} public class Example17{
public static void main(String[] args){
MyThread mt1 = new MyThread();
MyThread mt2 = new MyThread(); mt1.setName("关羽");
mt2.setName("张飞");
//设置守护线程
mt1.setDaemon(true);
mt2.setDaemon(true); mt1.start();
mt2.start(); Thread.currentThread().setName("刘备");//设置main线程名称
for(int x = ;x<;x++){
System.out.println(Thread.currentThread().getName()+x);//打印当前线程(main线程)名称
} }
} /*
设置了关羽张飞两个为守护线程
只要刘备这个线程结束了,则另外两个线程也要结束。 */

java基础(3)-多线程(1)的更多相关文章

  1. Java基础技术多线程与并发面试【笔记】

    Java基础技术多线程与并发 什么是线程死锁? ​死锁是指两个或两个以上的进程(线程)在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去,我们就可以称 ...

  2. Java基础之多线程篇(线程创建与终止、互斥、通信、本地变量)

    线程创建与终止 线程创建 Thread类与Runnable接口的关系 public interface Runnable { public abstract void run(); } public ...

  3. 关于java基础、多线程、JavaWeb基础、数据库、SSM、Springboot技术汇总

    作者 : Stanley 罗昊 本人自行总结,纯手打,有疑问请在评论区留言 [转载请注明出处和署名,谢谢!] 一.java基础 1.多态有哪些体现形式? 重写.重载 2. Overriding的是什么 ...

  4. Java基础之多线程框架

    一.进程与线程的区别 1.定义: 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比 ...

  5. Java基础之多线程详细分析

    在了解多线程之前,先来了解一下进程与线程之间的关系. 进程和线程: 进程是指在系统中正在执行的一个程序,每个进程之间是独立的. 线程是进程的一个基本执行单元.一个进程要想执行任务,必须得有线程(每1个 ...

  6. java基础知识 多线程

    package org.base.practise9; import org.junit.Test; import java.awt.event.WindowAdapter; import java. ...

  7. Java基础之多线程

    1.进程和线程: 进程:正在进行的程序.每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元. 线程:进程内部的一条执行路径或者一个控制单元. 两者的区别: 一个进程至少有一个线程 ...

  8. 黑马程序员——【Java基础】——多线程

    ---------- android培训.java培训.期待与您交流! ---------- 一.概述 (一)进程 正在执行中的程序,每一个进程执行都有一个执行顺序.该顺序是一个执行路径,或者叫一个控 ...

  9. 黑马程序员——JAVA基础之多线程的线程间通讯等

    ------- android培训.java培训.期待与您交流! ---------- 线程间通讯: 其实就是多个线程在操作同一个资源,但是动作不同. wait(); 在其他线程调用此对象的notif ...

  10. 黑马程序员——JAVA基础之多线程的安全问题

    ------- android培训.java培训.期待与您交流! ---------- 导致多线程出现问题的一个特殊的状态:就绪.具备了执行资格,但是还没有获取资源. 导致安全问题的出现的原因: 1. ...

随机推荐

  1. LoadRunner 测试java代码

    LR12 JDK 1.7,32位 环境变量配好 待测的java jar包及其依赖的jar包都整理好,放在jdk的lib目录下,也要把jar包放在脚本目录下! =====>新建Java Vuser ...

  2. 免安装mysql配置

    1.下载压缩包:去官网下载免安装的MySQL的压缩包http://dev.mysql.com/downloads/mysql/根据机器选择64位或者32位: 2.解压到相应目录.我解压到了D:\Pro ...

  3. jQuery EasyUI介绍

    官方定义:http://www.jeasyui.com/ what is JQuery EasyUI ? jQuery EasyUI framework helps you build your we ...

  4. Coursera课程《Machine Learning》学习笔记(week2)

    1 特征 1-1 什么是特征? 我的理解就是,用于描述某个样本点,以哪几个指标来评定,这些个指标就是特征.比方说对于一只鸟,我们评定的指标就可以是:(a)鸟的翅膀大还是小?(b)鸟喙长还是短?(c)鸟 ...

  5. 初识Python、数据类型、基本语句

    Python是一种面向对象的.直译式计算机程序设计语言,也是一种功能强大的且完善的通用型语言,是一种脚本语言. Python的主要特点:是面向过程的.面向对象的:模块丰富,功能强大:语法简单易学:扩展 ...

  6. WordArray (An array of 32-bit words.

    CryptoJS中WordArray - qiqi715 - 博客园 http://www.cnblogs.com/qiqi715/p/9623421.html

  7. Windows下批处理文件(.bat)的使用

    cmd文件和bat文件的区别:在本质上两者没有区别,都是简单的文本编码方式,都可以用记事本创建.编辑和查看.两者所用的命令行代码也是共用的,只是cmd文件中允许使用的命令要比bat文件多.cmd文件只 ...

  8. C#中的自定义控件中的属性、事件及一些相关特性的总结(转)

      摘要: C#中的自定义控件中的属性(Property).事件(Event)及一些相关特性(Attribute)的总结 今天学习了下C#用户控件开发添加自定义属性的事件,主要参考了MSDN,总结并实 ...

  9. 【Java工程师之路】[1-2.2]Java10个面向对象设计原则

    面向对象设计原则是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorator ...

  10. ACM中使用 JAVA v2. 1

    ACM中使用JAVA v2.1 严明超 (Blog:mingchaoyan.blogbus.com Email:mingchaoyan@gmail.com) 0.前 言 文前声明:本文只谈java用于 ...