黑马程序员—多线程(上)-线程及其创建方法
来源:互联网 发布:金融网络销售靠谱吗 编辑:程序博客网 时间:2024/04/30 12:50
---------------------- android培训、java培训、期待与您交流! ----------------------
1.进程与线程
进程:
是一个正在执行中的程序。
每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元。
线程:
就是进程中的一个独立的控制单元。
线程在控制着进程的执行。一个进程中至少有一个线程。
2.线程运行状态与常用方法
2.1线程运行状态
2.2常用方法
setPriority(int newPriority)更改线程的优先级。
start() 使该线程开始执行;Java虚拟机调用该线程的 run方法。
sleep(long millis) 在指定的毫秒数内让当前正在执行的线程休眠(暂停执行)
yield() 暂停当前正在执行的线程对象,并执行其他线程。
currentThread()返回对当前正在执行的线程对象的引用。
getName():获取线程名称。
System.currentTimeMillis(); 获取当前毫秒数。
setName() 设置线程的名称或者构造函数。
3.线程的创建方式
3.1创建方式一:
3.1.1步骤:
1.定义一个类并继承Thread类。
2.复写Thread类中的run方法。目的就是将自定义代码存储在run方法,让线程运行。
3.调用线程的start()启动线程。start()自动调用run方法
class Demo extends Thread { //Demo类继承Thread类 public void run(){ //复写run方法 for (int x=0;x<=50 ;x++ ) //该线程执行的任务 System.out.println("demo run---"+x); } } class ThreadDemo{ public static void main(String[] args) { Demo d = new Demo(); //创建线程 d.start(); //开始执行线程 for (int x=0;x<=50 ;x++ ) //主线程执行的任务 System.out.println("---main run---"+x); } }
3.1.2run()和start()方法
为什么覆盖run方法?
Thread类用于描述线程,该类定义了一个功能,用于存储线程要运行的代码,
该存储功能就是run方法。也就是说Thread类中的run方法用于存储线程要运行的代码。
线程都有自己默认的名称:Thread-编号。该编号从0开始。
通过下面实例总结:run()和start()的区别:start可以实现多线程,run就不能
run():只是Thread类的一个普通方法,可以启动一个线程,但只当这个线程的run执行完后,才执行后面的线程。
start():开启线程并使线程处于一种就绪状态,等待CPU的运行权限,获得后调用run方法
class Thread1 extends Thread { private String a=this.getName();//获取线程名称 public void run() { for (int x=0;x<10 ;x++ ) System.out.println(a+" 1111-"+x); } } class Thread2 extends Thread { private String a=this.getName();//获取线程名称 public void run() { for (int x=0;x<10 ;x++ ) System.out.println(a+" 2222-"+x); } } class ThreadDemo1103 { public static void main(String[] args) { Thread1 t1 = new Thread1(); Thread2 t2 = new Thread2(); t1.start(); t2.start(); //t1.run(); //t2.run(); for (int x=0;x<10 ;x++ ) System.out.println("Hello world----"+x); } }
通过以上事例可以看出:
每次运行结果都不同,是因为多个线程同时获取CPU执行权,CPU执行到谁,谁就运行。
可以形象的把多线程的运行行为看成是在互相争抢CPU的执行权。
在某一时刻,只能有一个程序在运行(多核CPU除外)。
这就是多线程的一个特性:随机性。谁抢到谁执行,执行多长时间,CPU说的算。
3.2创建方式二:
3.2.1步骤
2.复写Runnable接口中的run方法。将线程和车票的代码放在run方法中。
3.通过Thread类建立线程对象。
4.将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数。
//实现Runnable接口 class Ticket implements Runnable { //初始化票数。 private static int tick = 100; //复写Runnable接口的run方法 public void run(){ while(tick>0){ if(tick>0){ String WinName = Thread.currentThread().getName(); System.out.println(WinName+":"+tick--); } } } } class TicketDemo{ public static void main(String[] args){ Ticket t = new Ticket(); //在创建线程对象的同时,就指定run方法所属对象。 //通过Thread类创建4个线程对象。表示四个售票窗口。 //将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数。 Thread t1 = new Thread(t); Thread t2 = new Thread(t); Thread t3 = new Thread(t); Thread t4 = new Thread(t); //调用Thread类的start方法开启线程并调用Runnable接口子类的run方法。 t1.start(); t2.start(); t3.start(); t4.start(); } }
3.2.2继承和实现的区别:
继承Thread,线程代码存放在Thread子类run方法中。
3.3创建方式三:JDK.1.5创建线程池的方式创建线程
execute(Runnable command)
、在未来某个时间执行给定的命令。scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit)
,将要执行的任务覆盖在command中的run方法中import static java.util.concurrent.TimeUnit.*; class BeeperControl { private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); public void beepForAnHour() { final Runnable beeper = new Runnable() { public void run() { System.out.println("beep"); } }; final ScheduledFuture<?> beeperHandle = scheduler.scheduleAtFixedRate(beeper, 10, 10, SECONDS); scheduler.schedule(new Runnable() { public void run() { beeperHandle.cancel(true); } }, 60 * 60, SECONDS); } }
- 黑马程序员—多线程(上)-线程及其创建方法
- 黑马程序员-多线程(创建线程、方法、同步、通信)总结
- 黑马程序员——自学笔记10(多线程及其创建方法)
- 黑马程序员——Java多线程之创建线程
- 黑马程序员--04.多线程--03.【创建线程两种方法的对比】【多线程卖票案例设计】
- 黑马程序员——多线程(上)
- 黑马程序员——多线程(上)
- 黑马程序员-多线程(上)
- 黑马程序员--线程、多线程
- 黑马程序员——多线程--线程的创建方式和线程安全的简单介绍
- 黑马程序员——Java基础---线程的另一个总结(1)--基本创建方法
- 黑马程序员_Java中的多线程(创建和组织线程)
- 黑马程序员---多线程及其安全问题
- 黑马程序员--多线程及其同步
- 黑马程序员——多线程(线程间通信)
- 黑马程序员—单线程与多线程
- 黑马程序员——007——面向对象④(包)、多线程①(创建线程、同步、死锁)
- 黑马程序员--线程及其同步
- ios开发第一篇 简单的qq登录窗口
- python优化
- rails 的 Helpers
- android 中写rom文件命名时一点小小的总结
- 【算法导论】C++参考源码之线性时间排序
- 黑马程序员—多线程(上)-线程及其创建方法
- Linux软件的安装、卸载
- Struts2<s:date>标签使用详解
- 封装CopyFileEx函数,实现文件复制中的暂停,控速,获取进度
- 清除WebSphere中缓存
- 机房收费系统之关系图
- Tiny4412中配置Camera接口时钟
- 简单的题目4
- 基类指针转换为子类指针,子类指针转换为基类指针