java多线程学习(一)之创建线程的两种方式
来源:互联网 发布:梦里花落知多少小说 编辑:程序博客网 时间:2024/04/25 19:10
1、首先来了解一下线程和进程的概念
进程的概念:进程是操作系统资源管理的最小单位,进程是一个动态的实体,他是程序的一次执行过程。也叫作一个控制单元
线程的概念:
线程是进程中独立的控制单元,线程控制着进程的执行。一个进程中至少有一个线程。
java VM(java虚拟机)在运行时启动了一个进程---java.exe
该进程在执行时,至少有一个线程在控制着java程序的运行,并且这个线程存在于java的main函数中,
该线程称之为java的主线程。
扩展:在JVM运行时,除了main函数中的线程在运行外,还有JVM中负责java垃圾回收的线程在运行。因此,java不是单线程运行程序。
实现多线程的第一种方式(单继承方式):
1.继承自Thread类实现多线程
步骤:1)创建一个类继承Thread
2)覆写run方法
目的是存放多线程要执行的自定义代码。
3)在main函数中创建该类
4)使用start()方法调用该线程(start方法有两种含义:1,启动多线程。2,调用线程中的run方法)
public class Day1{ public static void main(String args[]){ DemoThread dt = new DemoThread(); dt.start(); //用于启动线程,并自动执行run方法。 dt.run(); //只是单纯的对象调用,在主线程中执行,并不开启子线程。 for(int i=0;i<50;i++){ System.out.println("main run-----"+i); } }}class DemoThread extends Thread{ public void run(){ for(int i=0;i<50;i++) System.out.println("demo run-----"+i); }}我们发现运行同一个程序,他们的运行结果却不太相同,
这是多个线程都获取系统的CPU资源,CPU执行到谁,谁就运行。
CPU在某一时刻只能执行一个程序(多核除外),CPU在做着快速的切换,以达到看上去是在同时执行的效果。
我们通过打印输出,来判断到底是哪一个线程抢占到了CPU的资源。
Thread类的意义-----用于描述线程。
该类定义了一个功能,用于存储线程要运行的代码,而这个存储功能就是run方法。
run方法中存储线程要执行的 自定义代码块。
而start方法用于启动线程,并自动执行run方法。
Thread类中提供的常用的方法:
static Thread currentThread: 返回当前正在执行的线程对象的引用
String getName();返回当前线程的名称。
当使用Thread的无参构造创建线程实例时,java虚拟机会自动为线程创建一个名字。(以Thread-编号的格式)
static void sleep(long time) 使线程休眠time时间。
创建线程的第二种方式(实现Runnable接口):
实现Runnable 接口来实现多线程:
步骤:
1)创建类实现Runnable接口
2)实现Runnable接口中的run方法
3)创建Thread对象
4)将Runnable对象作为实际参数传递给Thread的构造方法
5)调用Thread类的start方法,自动执行Runnable对象中的run方法
public class Day1Runable{ public static void main(String args[]){ DemoRunnable dr = new DemoRunnable(); Thread t1 = new Thread(dr); Thread t2 = new Thread(dr); Thread t3 = new Thread(dr); Thread t4 = new Thread(dr); t1.start(); t2.start(); t3.start(); t4.start(); }}class DemoRunnable implements Runnable{ private int ticket=100; public void run(){ while(true){ if(ticket>0) System.out.println(Thread.currentThread().getName()+"--售票:"+ticket--); } }}
问题:继承方式与实现方式有什么区别
1、避免了单继承的局限性
2、多线程执行代码位置不同:
继承Thread类:代码存放在Thread类的run方法中
实现Runnable类:代码存放在Runnable接口的run方法中。
- java多线程学习(一)之创建线程的两种方式
- Java基础:多线程之线程创建的两种方式
- java多线程之创建线程的两种传统方式
- Java多线程总结(一):Java两种创建线程方式的比较
- 多线程学习(三)之创建线程的两种方式
- (一) Java多线程详解之多线程概念和创建线程的两种方式
- 多线程之线程创建的两种方法(Java)
- java多线程总结一:线程的两种创建方式及优劣比较
- java多线程总结一:线程的两种创建方式及优劣比较
- java多线程总结一: 线程的两种创建方式及优劣比较
- java多线程总结一: 线程的两种创建方式及优劣比较
- java多线程总结一:线程的两种创建方式及优劣比较
- java多线程总结一:线程的两种创建方式及优劣比较
- java多线程总结一: 线程的两种创建方式及优劣比较
- java多线程总结一:线程的两种创建方式及优劣比较
- java多线程总结一:线程的两种创建方式及优劣比较
- java多线程总结一:线程的两种创建方式及优劣比较
- java多线程总结一:线程的两种创建方式及比较
- 2015年12月资料整理
- Java内功提升之继承
- SAFEARRAY传递自定义结构体
- 指针与引用的实现细节原理及如何选用
- Mybatis整合Spring
- java多线程学习(一)之创建线程的两种方式
- github使用记录
- 一位牛人归纳的JavaScript 语言基础知识点图示(上)
- 我是如何自学Android,资料分享
- 解决ios设备中angularjs无法改变页面title的问题
- Zookeeper之基于Observer部署架构
- Content Provider详解
- Highcharts图形x坐标轴密度的问题
- LineEdit小控件