一.线程常见问题和多线程的内存解析
1.thread.run()!=thread.start():run()不会执行多线程,start()会执行多线程
2.多线程的内存解析
多个线程处于不同的栈空间,不会相互影响
二.线程常用方法
1.获取线程名:
Thread.currentThread().getName();
2.创建线程
A.实现接口
public class MyThread implements Runnable{
@Override
public void run(){}
}
Thread t=new Thread(new MyThread());
B.?当线程仅使用一次的话:使用匿名内部类来实现runnable 接口
public static void main(String args[])
{
Runnable r=new Runnable() {
//重写run方法
public void run() {
for(int i=0;i<5;i++)
System.out.println(Thread.currentThread().getName()+"-->"+i);
}
};
new Thread(r).start();
}
三.线程的同步
1.使用同步代码块进行线程同步
A.代码块中的锁对象可以使用任意对象,?但多个线程必须使用同一个锁,这就要求锁对象是成员变量
B.锁对象的作用:只让一个线程在同步代码块中执行
C.sleep()会使线程放弃锁么?会放弃CPU么?会放弃资源么?
?只有出了synchronized()才会归还锁
A.进入sleep状态的线程不会放弃锁,会放弃CPU,保有资源从而进入就绪态(因为这个时候还保有资源,比如说卖票系统的票)
B.线程即使在持有锁的线程sleep()中,无锁、无CPU、无资源从而进入到阻塞态
D.买票系统的使用同步代码块的实现
实现runnable接口的类
public class MyThread implements Runnable{
private int tickets=10;
Object obj=new Object();//锁对象要定义成成员方法
@Override
public void run()
{
while(true)
{
//使用同步代码块来进行线程同步
synchronized (obj) {
if(tickets>0)
{
System.out.println(Thread.currentThread().getName()+"--->正在卖第张"+tickets+"票");
tickets--;
}
}
}
}
主方法
MyThread t=new MyThread();
new Thread(t).start();;
new Thread(t).start();
new Thread(t).start();
2.使用同步方法进行同步
A.同步方法锁的对象是:实现Runnable接口的类
B.
格式:把访问临界资源的代码进行封装,再在void前加上synochronized
public class MyThread implements Runnable{
private int tickets=10;
@Override
public void run()
{
while(true)
{
payTicket();
if(tickets<=0)
break;
}
}
public synchronized void payTicket()
{
if(tickets>0)
{
System.out.println(Thread.currentThread().getName()+"--->正在卖第张"+tickets+"票");
tickets--;
}
}
}
主方法同同步代码块
3.使用锁
A.需要导util.*
B.
public class MyThread implements Runnable{
private int tickets=10;
Lock l=new ReentrantLock();
@Override
public void run()
{
l.lock();//进入区进行加锁
while(true)
{
//临界区
if(tickets>0)
{
System.out.println(Thread.currentThread().getName()+"--->正在卖第张"+tickets+"票");
tickets--;
}
if(tickets<=0)
break;
}
l.unlock();//退出区进行解锁
}
}
主方法同同步代码块
四.进程通信
1.进程通信<==>进程的等待和唤醒机制
2.只有锁对象可以调用notify()、notifyAll()和wait()方法,「就是synchronized 传进去的对象」,notifyAll()是唤醒所有所有锁的对象
3.生产者消费者问题的Java实现—第四节等待唤醒机制
五.线程池
1.JDK提供的线程池–第四节等待唤醒机制