一、线程的概念
二、进程与线程
三、线程的状态
四、线程同步
---------------------------------------------------------------------------------------------------------------------------------
一、线程的概念
▪ 程序:Program,是一个指令的集合
▪ 进程:Process,(正在执行中的程序)是一个静态的概念
进程是程序的一次静态态执行过程, 占用特定的地址空间.
每个进程都是独立的,由3部分组成cpu,data,code
缺点:内存的浪费,cpu的负担
▪ 线程:是进程中一个“单一的连续控制流程” (a singlesThread,equential flow of control)/执行路径
线程又被称为轻量级进程(lightweight process)。
Threads run at the same time, independently of one another
一个进程可拥有多个并行的(concurrent)线程
一个进程中的线程共享相同的内存单元/内存地址空间可以访问相同的变量和对象,而且它们从同一堆中分配对象-->通信、数据交换、同步操作
由于线程间的通信是在同一地址空间上进行的,所以不需要额外的通信机制,这就使得通信更简便而且信息传递的速度也更快。
• Java虚拟机启动的时候会有一个迚程java.exe,该进程中至少有一个线程,在负责java程序的执 行。而且这个线程运行的代码存在亍main方法中,该线程称之为主线程。
• 一个进程中的线程共享代码和数据空间
• 线程结束,进程未毕结束,但进程结束,线程一定结束。
• 进程中包含线程,线程是进程的一部分
二、进程与线程
JAVA中实现多线程(一)
▪ 在Java中负责线程的这个功能的是Java.lang.Thread 这个类
▪ 可以通过创建 Thread 的实例来创建新的线程。
▪ 每个线程都是通过某个特定Thread对象所对应的方法run( )来完成其操作的,方法run( )称为线程体。
▪ 通过调用Thead类的start()方法来启动一个线程。
创建线程的方式一>继承Thread类
public class ThreadDemo extends Thread{
public ThreadDemo(String threadName) {
super(threadName);
}
@Override
public void run() {
for (int i = 0; i <10 ; i++) {
System.out.println(Thread.currentThread().getName()+"run()--------"+i);
}
}
public static void main(String[] args) {
//创建线程对象
ThreadDemo threadDemo =new ThreadDemo("自定义线程");
System.out.println(threadDemo.isAlive());
//启动线程
threadDemo.start();
System.out.println(threadDemo.isAlive());
// threadDemo.run();
//获取线程的优先级,一般情况优先级是0-10之间的整数,默认优先级是5,特殊情况下也可以是0-100之间的整数。
// System.out.println(threadDemo.getPriority());
//修改优先级为10
// threadDemo.setPriority(10);
for (int i = 0; i <10 ; i++) {
System.out.println(Thread.currentThread().getName()+"main()--------"+i);
}
System.out.println(threadDemo.isAlive());
}
}
创建线程的方式二——>实现Runnable接口
public class RunnableDemo implements Runnable{
@Override
public void run() {
for (int i = 0; i <10 ; i++) {
System.out.println(Thread.currentThread().getName()+"-----------"+i);
}
}
public static void main(String[] args) {
//创建线程对象
RunnableDemo runnableDemo =new RunnableDemo();
//启动线程---使用java中的设计模式(代理模式)
Thread thread = new Thread(runnableDemo);
thread.start();
for (int i = 0; i <10 ; i++) {
System.out.println(Thread.currentThread().getName()+"-----------"+i);
}
}
}
买票RunnableTicket.java
/**出现的问题:
* 1、卖票的次序是混乱的;
* 2、每个窗口不能平均的卖票,分配不均,有些窗口卖了很多票,有些窗口一张票都没卖。这个不符合显示情况。
*
*/
public class RunnableTicket implements Runnable {
//资源(火车票)
private int ticket = 10;
@Override
public void run() {
for(int i =0; i <100;i++){
if(ticket > 0){
System.out.println(Thread.currentThread().getName() + "----------正在卖第" + (ticket--) +"张票!");
}
}
}
public static void main(String[] args) {
RunnableTicket runnableTicket = new RunnableTicket();
Thread t1 = new Thread(runnableTicket,"1号窗口");
Thread t2 = new Thread(runnableTicket,"2号窗口");
Thread t3 = new Thread(runnableTicket,"3号窗口");
Thread t4 = new Thread(runnableTicket,"4号窗口");
t1.start();
t2.start();
t3.start();
t4.start();
}
}
RunnableTicket2.java
/**
*出现的问题:
* 1、卖票的次序是混乱的;
* 2、每个窗口不能平均的卖票,分配不均,有些窗口卖了很多票,有些窗口一张票都没卖。这个不符合显示情况。
*/
public class RunnableTicket2 implements Runnable {
//资源(火车票)
private Integer ticket = 10;
// String str = "";
@Override
public void run() {
//定义一个共同的锁
/*
当多个线程共同访问同一个资源的时候,会出现线程安全问题,此时解决办法之一是加锁,
在java中要求锁是对象类型,任何对象都是可以的,但是需要保证多个线程访问的是同一把锁。
程序中锁的名称特别的锁:
1、锁旗标;
2、同步监视器;
3、同步锁;
4、互斥锁;
5、对象锁;
6、锁
... ...
*/
// String str = "";
for (int i = 0; i < 100; i++) {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (ticket) {
// synchronized (this){
if (ticket > 0) {
System.out.println(Thread.currentThread().getName() + "----------正在卖第" + (ticket--) + "张票!");
}
}
}
}
public static void main(String[] args) {
RunnableTicket2 runnableTicket = new RunnableTicket2();
Thread t1 = new Thread(runnableTicket, "1号窗口");
Thread t2 = new Thread(runnableTicket, "2号窗口");
Thread