并发:指两个或多个事件在同一个时间段内发生。 进程:是指一个内存中运行的应用程序,每个进程都有一个独立的内存空间,一个应用程序可以同时运行多个。 Java使用java. lang. Thread类代表线程,所有的线程对象都必须是Thread类或其子类的实例。每个线程的作用是 单线程 主函数 执行结果 创建多线程程序的第一种方式: 创建Thread类的子类 void start()使该线程开始执行; Java虚拟机调用该线程的run方法。 主函数 执行结果 获取线程的名称: 主函数 执行结果 设置线程的名称:(了解) 主函数 执行结果 public static void sleep(long millis):使当前正在执行的线程以指定的毫秒数暂停(暂时停止执行)。 采用. java.lang.runnable ’ 也是非常常见的一-种,我们只需要重写run方法即可。 主函数 执行结果 实现Runnable接口创建多线程程序的好处: 主函数 执行结果 匿名内部类方式实现线程的创建 执行结果
1. 并发与并行
并行:指两个或多个事件在同一时刻发生(同时发生)。2. 线程与进程
进程;进程也是程序的一次执行过程,是系统运行程序的基本单位;系统运行一个程序即是一个进程从创建、
运行到消亡的过程。
线程:线程是进程中的一个执行单元,负责当前进程中程序的执行, -个进程中至少有一个线程。一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序。
简而言之:一个程序运行后至少有一个进程 , 一个进程中可以包含多个线程
线程调度:
分时调度
所有线程轮流使用CPU的使用权,平均分配每个线程占用CPU的时间。
抢占式调度
优先让优先级高的线程使用CPU ,如果线程的优先级相同,那么会随机选择一个(线程随机性) , Java使用的为抢占式调度。3. 创建线程类
完成一定的任务,实际上就是执行一段程序流即一 段顺序执行的代码。 Java使用线程执行体来代表这段程序流。
Java中通过继承Thread类来创建并启动多线程的步骤如下:
package cn.itcast.day12.demo02; public class Person { private String name; public void run() { for (int i = 0; i < 20; i++) { System.out.println(name + "-->" + i); } } public Person() { } public Person(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
package cn.itcast.day12.demo02; /* 主线程:执行主(main)方法的线程 单线程程序:java程序中只有一个线程 执行从main方法开始,从上到下依次执行 JVM执行main方法, main方法会进入到栈内存 JV会找操作系统开辟一条main方法通 向cpu的执行路径 cpu就可以通过这个路径来执行main方法 而这个路径有一个名字, 叫main(主)线程 */ public class SoloThread { public static void main(String[] args) { Person pe = new Person("周冬雨"); pe.run(); Person pe1 = new Person("刘亦菲"); pe1.run(); } }
周冬雨-->0 周冬雨-->1 周冬雨-->2 周冬雨-->3 周冬雨-->4 周冬雨-->5 周冬雨-->6 周冬雨-->7 周冬雨-->8 周冬雨-->9 周冬雨-->10 周冬雨-->11 周冬雨-->12 周冬雨-->13 周冬雨-->14 周冬雨-->15 周冬雨-->16 周冬雨-->17 周冬雨-->18 周冬雨-->19 刘亦菲-->0 刘亦菲-->1 刘亦菲-->2 刘亦菲-->3 刘亦菲-->4 刘亦菲-->5 刘亦菲-->6 刘亦菲-->7 刘亦菲-->8 刘亦菲-->9 刘亦菲-->10 刘亦菲-->11 刘亦菲-->12 刘亦菲-->13 刘亦菲-->14 刘亦菲-->15 刘亦菲-->16 刘亦菲-->17 刘亦菲-->18 刘亦菲-->19
3.2 多线程的建立
java. lang. Thread类:是描述线程的类,我们想要实现多线程程序,就必须继承Thread类
实现步骤:
结果是两个线程并发地运行;当前线程(main线程)和另一个线程(创建的新线程,执行其run方法)。
多次启动一个线程是非法的。特别是当线程已经结束执行后,不能再重新启动。
java程序属于抢占式调度,那个线程的优先级高,那个线程优先执行;同-一个优先级,随机选择一个执行
多线程package cn.itcast.day12.demo02; //1. 创建一个Thread类的子类 public class MyThread extends Thread { //2. 在Thread类的子类中重写Thread类中的方法,设置线程任务(开启线程要做什么) @Override public void run(){ for (int i = 0; i < 10; i++){ System.out.println("run: " + i); } } }
package cn.itcast.day12.demo02; public class MulThread { public static void main(String[] args) { //3. 创建Thread类的子类对象 MyThread mt = new MyThread(); //4. 调用Thread类中的方法start,开启新的线程,执行run方法 mt.start(); for(int i = 0; i < 10; i++){ System.out.println("main :" + i); } } }
run: 0 main :0 run: 1 main :1 run: 2 main :2 run: 3 main :3 run: 4 main :4 run: 5 main :5 run: 6 main :6 run: 7 run: 8 run: 9 main :7 main :8 main :9
3.3 多线程的原理
4. Thread类中常用的方法
4.1 获取线程名称
String getName() 返回该线程的名称。
static Thread current Thread()返回对当前正在执行的线程对象的引用。package cn.itcast.day12.demo02; //定义一个Thread类的子类 public class MyThread01 extends Thread { //重写Thread类中的run方法,设置线程任务 @Override public void run(){ System.out.println(Thread.currentThread().getName()); } }
package cn.itcast.day12.demo02; public class GetThreadName { public static void main(String[] args) { //创建Thread类的子类对象 MyThread01 mt = new MyThread01(); //调用start方法,开启新线程,执行run方法 mt.start(); new MyThread01().start(); new MyThread01().start(); } }
Thread-0 Thread-2 Thread-1
4.2 设置线程名称
void setName(String name) 改变线程名称,使之与参数name相同。
Thread(String name) 分配新的Thread 对象。package cn.itcast.day12.demo02; public class MyThread02 extends Thread{ public MyThread02(){} public MyThread02(String name){ super(name); } @Override public void run(){ System.out.println(Thread.currentThread().getName()); } }
package cn.itcast.day12.demo02; public class SetThreadName { public static void main(String[] args) { //开启多线程 MyThread02 mt = new MyThread02(); mt.setName("周冬雨"); mt.start(); //开启多线程 new MyThread02("刘亦菲").start(); } }
周冬雨 刘亦菲
4.3 sleep
毫秒数结束之后,线程继续执行package cn.itcast.day12.demo02; public class sleep { public static void main(String[] args) { //模拟毫秒 for (int i = 0; i <= 60 ; i++) { System.out.println(i); //使用Thread类的sleep方法让程序睡眠1秒钟 try{ Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }
4.4 创建线程方式二
创建多线程程序的第二种方式:实现Runnable接口
java. lang. Runnable
Runnable接口应该由那些打算通过某一线程执行其实例的类来实现。类必须定义一个称为run的无参数方法。
java. lang. Thread类的构造方法
Thread(Runnable target) 分配新的Thread 对象。
Thread(Runnable target, String name) 分配新的Thread 对象。
实现步骤:
package cn.itcast.day12.demo02; //1. 创建一个Runnable接口的实现类 public class RunnableImpl implements Runnable{ //2. 在实现类中重写Runnable接口的run方法。设置线程任务 @Override public void run(){ for(int i = 0; i < 10; i++){ System.out.println(Thread.currentThread().getName() + "-->" + i); } } }
package cn.itcast.day12.demo02; public class Runnable01 { public static void main(String[] args) { //3. 创建一个Runnable接口的实现类对象 RunnableImpl run = new RunnableImpl(); //4. 创建Thread类对象,构造方法中传递Runnable接口的实现类对象 Thread t = new Thread(run); //5.调用Thread类中的start方法,开启新的线程执行run方法 t.start(); for (int i = 0; i <20 ; i++) { System.out.println(Thread.currentThread().getName()+"-->"+i); } } }
Thread-0-->0 Thread-0-->1 main-->0 Thread-0-->2 main-->1 Thread-0-->3 main-->2 Thread-0-->4 Thread-0-->5 Thread-0-->6 Thread-0-->7 main-->3 Thread-0-->8 main-->4 Thread-0-->9 main-->5 main-->6 main-->7 main-->8 main-->9 main-->10 main-->11 main-->12 main-->13 main-->14 main-->15 main-->16 main-->17 main-->18 main-->19
4.4 Thread和Runnable的区别
package cn.itcast.day12.demo02; //1. 创建一个Runnable接口的实现类 public class RunnableImpl2 implements Runnable{ //2. 在实现类中重写Runnable接口的run方法。设置线程任务 @Override public void run(){ for(int i = 0; i < 10; i++){ System.out.println("Hello World" + i); } } }
package cn.itcast.day12.demo02; public class Runnable01 { public static void main(String[] args) { //3. 创建一个Runnable接口的实现类对象 RunnableImpl run = new RunnableImpl(); //4. 创建Thread类对象,构造方法中传递Runnable接口的实现类对象 // Thread t = new Thread(run); Thread t = new Thread(new RunnableImpl2()); //5.调用Thread类中的start方法,开启新的线程执行run方法 t.start(); for (int i = 0; i <20 ; i++) { System.out.println(Thread.currentThread().getName()+"-->"+i); } } }
Hello World0 Hello World1 Hello World2 Hello World3 Hello World4 Hello World5 Hello World6 Hello World7 Hello World8 Hello World9 main-->0 main-->1 main-->2 main-->3 main-->4 main-->5 main-->6 main-->7 main-->8 main-->9
5. 匿名内部类方式实现线程的创建
匿名:没有名字
内部类:写在其他类内部的类
匿名内部类作用:简化代码
把子类继承父类,重写父类的方法,创建子类对象合一步完成
把实现类实现类接口,重写接口中的方法,创建实现类对象合成一步完成
匿名内部类的最终产物:子类/实现类对象,而这个类没有名字格式: new 父类/接口(){ 重复父类/接口中的方法 };
package cn.itcast.day12.demo02; public class InnerClassThread { public static void main(String[] args) { //线程的父类是Thread //new MyThread().start(); new Thread(){ //重写run方法,设置线程任务 @Override public void run(){ for (int i = 0; i <10 ; i++) { System.out.println(Thread.currentThread().getName()+"-->"+"周冬雨"); } } }.start(); //Runnable r = new RunnableImpl();//多态 Runnable r = new Runnable(){ @Override public void run() { for (int i = 0; i <10 ; i++) { System.out.println(Thread.currentThread().getName()+"-->"+"刘亦菲"); } } }; new Thread(r).start(); //简化接口的方式 new Thread(new Runnable(){ //重写run方法,设置线程任务 @Override public void run() { for (int i = 0; i <10 ; i++) { System.out.println(Thread.currentThread().getName()+"-->"+"杨超越"); } } }).start(); } }
Thread-2-->杨超越 Thread-2-->杨超越 Thread-2-->杨超越 Thread-2-->杨超越 Thread-2-->杨超越 Thread-2-->杨超越 Thread-2-->杨超越 Thread-2-->杨超越 Thread-2-->杨超越 Thread-2-->杨超越 Thread-0-->周冬雨 Thread-0-->周冬雨 Thread-0-->周冬雨 Thread-0-->周冬雨 Thread-0-->周冬雨 Thread-0-->周冬雨 Thread-0-->周冬雨 Thread-0-->周冬雨 Thread-0-->周冬雨 Thread-0-->周冬雨 Thread-1-->刘亦菲 Thread-1-->刘亦菲 Thread-1-->刘亦菲 Thread-1-->刘亦菲 Thread-1-->刘亦菲 Thread-1-->刘亦菲 Thread-1-->刘亦菲 Thread-1-->刘亦菲 Thread-1-->刘亦菲 Thread-1-->刘亦菲
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算