Java中的多线程

一.线程常见问题和多线程的内存解析
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提供的线程池–第四节等待唤醒机制

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值