黑马程序员—线程概述

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
多线程:
线程是依赖着进程存在的

进程:
正在运行的程序,是系统进行资源分配和调用的独立单位。
每一个进程都有它自己的内存空间和系统资源。
线程:
是进程中的单个顺序控制流,是一条执行路径
一个进程如果只有一条执行路径,则称为单线程程序。
一个进程如果有多条执行路径,则称为多线程程序


单进程单线程: 一个独木桥,同时只能有一个人过;多个人的时候排队,依次通过
单进程多线程:一座大桥, 同时可以有多辆汽车行驶
多进程多线程:多座大桥,每座桥上,都可以同时可以有多辆汽车行驶
如何创建一个线程呢?
想创建线程,那么要先有进程,而进程我们创建不了,由系统来创建,我们在进程的基础上,创建线程 ( Thread )

Thread类:
是程序中的执行线程。Java 虚拟机允许应用程序并发地运行多个执行线程。

创建线程的几种方式?(重点)
创建新执行线程有两种方法
方式1:
继承Thread线程类
1,创建一个类为 Thread类的子类
2,该子类应重写 Thread 类的 run 方法
3,创建子类对象
4,调用start()方法,启动线程

方式2;
创建一个实现 Runnable 接口的类
1,创建自定义类实现 Runnable接口
2,在自定义类重写run()方法
3,创建自定义类对象
4,创建线程对象,并把自定义类对象,作为构造方法参数使用
5,调用start()方法,启动线程

面试题:线程的生命周期


面试题:
问:启动线程 使用的是start()方法 还是 run()方法??
启动线程 使用的是start()方法

public void start()
使该线程开始执行;Java 虚拟机调用该线程的 run 方法。
public void run()
指定每一个线程启动后,要执行的操作


Thread类方法介绍———-线程类
创建线程的基本方法————— User u=new User();—-User类实现了Runnable接口的
Thread t=new Thread(u);
* 构造方法:
* public Thread(String name)分配新的 Thread 对象———-给对象起名字
* 方法:
* public final String getName()返回该线程的名称。
* 默认的线程名称为: Thread-编号, 编号从0开始
* public final void setName(String name)
* 改变线程名称,使之与参数 name 相同

public static Thread currentThread()
返回对当前正在执行的线程对象的引用。
返回:当前执行的线程
public final int getPriority()返回线程的优先级。
public final void setPriority(int newPriority)更改线程的优先级
IllegalArgumentException - 如果优先级不在 MIN_PRIORITY 到 MAX_PRIORITY 范围内。
IllegalArgumentException 抛出的异常表明向方法传递了一个不合法或不正确的参数

public static final int MAX_PRIORITY 10 最大优先级
public static final int MIN_PRIORITY 1 最小优先级
public static final int NORM_PRIORITY 5 默认优先级

public static void sleep(long millis)
throws InterruptedException在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),


public void run() :
如果该线程是使用独立的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run 方法;否则,该方法不执行任何 操作并返回。
Thread 的子类应该重写该方法。

public void run() {------------------将此方法重写     如:   public void run() {
          if (target != null) {                                                        for (int i = 1; i <= 100; i++) {
              target.run();                                                                 System.out.println(getName() +"=="+ i);
          }                                                                                                    }
      }

综合案例1:
多个售票员一起卖电影票案例
*
* 票 class Ticket
* 售票员 (线程)
*
* ————————
* 发现模拟真实卖票出现的问题
* 1,重复的票
* 2,负数的票
*
* ———————–
* 解决上述的问题
* 通过线程的同步机制来解决问题
* 线程的同步机制 就是 保证线程安全
*
* 线程安全 – 线程同步 – Vector
* 线程不安全 – 线程不同步 – ArrryList
*
* ————————–
* 同步机制的实现方式:
* 1, 同步代码块
* 格式:
* synchronized(锁对象) {
* 可能出现线程不同步问题的代码
* }
* 这里的锁对象,可以是任何创建的对象
*
* 2, 同步方法
* 普通同步方法
*
* 静态同步方法
*
*/
代码实例

public class TicketThread {
public static void main(String[] args) {
//票
Ticket ticket = new Ticket();

//创建3个售票员
Thread t1 = new Thread(ticket, "售票员1号");
Thread t2 = new Thread(ticket, "售票员2号");
Thread t3 = new Thread(ticket, "售票员3号");
//启动线程
t1.start();
t2.start();
t3.start();
}
}
public class Ticket implements Runnable {


private int ticket = 100;// 剩余票数
private Object lock = new Object();// 任何的对象都可以作为锁


@Override
public void run() {
while (true) {
// t1,t2,t3
method();
}
}
// 同步方法
private synchronized void method() {
// synchronized( lock ){// synchronized 线程同步,锁
if (ticket > 0) {// 有票就卖票 ticket = 1;
// 模拟选座位
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
// t1,t2,t3
System.out.println(Thread.currentThread().getName() + "--正在卖 "
+ ticket);// 1,0,-1
ticket--;// 剩余票数0,-1,-2
}
// }


}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值