线程入门

本文深入探讨了Java中的线程实现方式,包括通过Runnable接口和Thread类创建线程,以及线程间的同步机制,如synchronized关键字的使用,死锁现象的产生与避免,和wait与notify方法在生产者消费者模型中的应用。
摘要由CSDN通过智能技术生成

package cn.tedu.thread;

public class RunnableDemo {

public static void main(String[] args) {
	//通过Runnable接口的实现类对象构建Thread类对象
	Thread t=new Thread(new RDemo());
	//开启线程
	t.start();
	for(int i=10;i>=0;i--){
		System.out.println("main"+i);
	}
}

}

//线程代码逻辑所在类—实现Runnable接口
class RDemo implements Runnable{
//线程的代码逻辑在run方法中
@Override
public void run() {
// TODO Auto-generated method stub
for(int i=0;i<=10;i++){
System.out.println(“I”+i);
}
}
}


package cn.tedu.thread;

public class ThreadDemo {
public static void main(String[] args) {
//创建了一个线程代码逻辑所在类的对象
TDemo1 t=new TDemo1();
//开启线程
t.start();
//t.run();
for(int i=10;i>=0;i–){
System.out.println(“main”+i);
}
}
}

//Thread类—线程
//线程代码逻辑所在的类
//线程不会回头直接往下执行
class TDemo1 extends Thread{
//小任务的内容—信息
//线程的逻辑代码放在重写run方法中
@Override
public void run() {
// TODO Auto-generated method stub
for(int i=0;i<=10;i++){
System.out.println(“I”+i);
}
}
}


同步代码锁
package cn.tedu.thread;
//synchronized 锁的是整个执行过程
//买票—四个售票窗口卖100张票
public class SellerTicketText1 {

public static void main(String[] args) {
	//创建票类对象
	Ticket t=new Ticket();
	//设置票数
	t.setTicket(100);
	//四个窗口
	Seller s1=new Seller(t);
	Seller s2=new Seller(t);
	Seller s3=new Seller(t);
	Seller s4=new Seller(t);
	//开启四个线程---给定线程名
	new Thread(s1,"A").start();
	new Thread(s2,"B").start();
	new Thread(s3,"C").start();
	new Thread(s4,"D").start();
}

}

//线程的逻辑代码所在的类—售票窗口类
class Seller implements Runnable{
//
Ticket t;
public Seller(Ticket t){
this.t=t;
}
//线程的逻辑代码
@Override
public synchronized void run() {//同步方法锁—如果方法是非静态方法,锁对象就是this
//如果是静态方法锁对象就是类名.class

// TODO Auto-generated method stub
//循环
while(true){//票数为0
//同步代码锁
//synchronized (t) {//锁对象—被当前线程共享—共享资源
//t Math String
//this不行,加上4把不同的锁
// 结束条件
if (t.getTicket() <= 0)
break;
// 设置新的剩余票数
t.setTicket(t.getTicket() - 1);
// 输出
// Thread.currentThread()获取当前执行的线程
System.out.println(Thread.currentThread().getName() + “卖了一张票,还剩” + t.getTicket() + “张票…”);
//}

	}
}

}

//表示票的类
class Ticket{
//属性—票数
private int ticket;

public int getTicket() {
	return ticket;
}

public void setTicket(int ticket) {
	this.ticket = ticket;
}

}


this 加一把锁的代码
package cn.tedu.thread;

public class SellerTicketText2 {

public static void main(String[] args) {
	//创建票类对象
	Ticket t=new Ticket();
	//设置票数
	t.setTicket(100);
	//一个窗口---针对this作为锁对象就可以锁住四个线程
	Seller s1=new Seller(t);
	/*Seller s2=new Seller(t);
	Seller s3=new Seller(t);
	Seller s4=new Seller(t);*/
	//开启四个线程---给定线程名
	new Thread(s1,"A").start();
	new Thread(s1,"B").start();
	new Thread(s1,"C").start();
	new Thread(s1,"D").start();
}

}

同步:多个线程每次只能 执行一个,异步:多个线程每次可以执行多个


死锁
package cn.tedu.thread;

public class DeadLockDemo {

//创建对象
static Scann s=new Scann();
static Printer p=new Printer();

public static void main(String[] args) {
	//开启线程
	new Thread(new Runnable() {
		
		@Override
		public void run() {
			// TODO Auto-generated method stub
			//扫描
			synchronized (s) {
				s.scan();
				//睡眠
				try {
					Thread.sleep(20);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				synchronized (p) {
				    p.print();
				}
			}
		}
	}).start();
	
	//
	new Thread(new Runnable() {
		
		@Override
		public void run() {
			// TODO Auto-generated method stub
			//打印
			synchronized (p) {
				p.print();
				
				synchronized (s) {
					s.scan();
				}
			}
		}
	}).start();
}

}

//扫描类—代表扫描机器
class Scann{
public void scan(){
System.out.println(“在吭哧吭哧的扫描…”);
}
}
//打印类—代表打印的机器
class Printer{
public void print(){
System.out.println(“在呼哧呼哧的打印…”);
}
}


解锁
package cn.tedu.thread;

public class WaitNotifyDemo {

public static void main(String[] args) {
	//创建学生类对象
	Student s=new Student();
	s.setName("tom");
	s.setGender('男');
	//开启线程
	new Thread(new Ask(s)).start();
	new Thread(new Change(s)).start();
}

}

//问问题类—线程代码逻辑
class Ask implements Runnable{
//
private Student s;
public Ask(Student s){
this.s=s;
}
@Override
public void run() {
// TODO Auto-generated method stub
//问问题
while(true){
防止多线程的抢占—保证性别
synchronized (s) {
//让线程等待–阻塞
if(s.flag==false)
try {
s.wait();//线程等待
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(“老师您好,我是” + s.getName() + “,我是” + s.getGender() + “生,我来问问题…”);
//唤醒线程
s.notify();
s.flag=false;
}

	}
}

}

//控制换学生—线程代码逻辑
class Change implements Runnable{
//
private Student s;
public Change(Student s){
this.s=s;
}
@Override
public void run() {
// TODO Auto-generated method stub
//换学生
while(true){
//防止多线程的抢占—保证性别
synchronized (s) {
//线程等待
if(s.flag==true)
try {
s.wait();//线程等待
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 换学生的条件
if (s.getName().equals(“tom”)) {
s.setName(“lili”);
s.setGender(‘女’);
} else {
s.setName(“tom”);
s.setGender(‘男’);
}
//唤醒
s.notify();
s.flag=true;
}

	}
}

}

//学生类
class Student{
//属性
private String name;
private int age;
private char gender;
//标志位—控制哪个线程等待
boolean flag=true;
public String getName() {
return name;
}
public char getGender() {
return gender;
}
public void setGender(char gender) {
this.gender = gender;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}

}


生产者消费者模型
package cn.tedu.thread;
//生产消费模型
public class WaitNotifyText {
public static void main(String[] args) {
Pruduct p=new Pruduct();
//p.setProduct(100);
//开启线程
new Thread(new Productor§).start();
new Thread(new Consumer§).start();
}
}

//生产类—通过线程实现生产过程
class Productor implements Runnable{
//
private Pruduct p;
public Productor(Pruduct p) {
// TODO Auto-generated constructor stub
this.p=p;
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true){
synchronized § {
while(p.flag==false)//强制每个线程都有判断一次,如果不是while 相同线程就有问题
try {
p.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 可以生产的最大值
int max = 1000 - p.getProduct();
// 随机生产数量
int count = (int) (Math.random() * (max + 1));
// 设置进去此次生产的随机数量
p.setProduct(p.getProduct() + count);
// 输出
System.out.println(“此次生产” + count + “个商品,还剩” + p.getProduct() + “个…”);
//随机唤醒
//p.notify();
//全部唤醒
p.notifyAll();
p.flag=false;
}

	}
}

}

//消费类—通过线程实现消费过程
class Consumer implements Runnable{
private Pruduct p;
public Consumer(Pruduct p) {
// TODO Auto-generated constructor stub
this.p=p;
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true){
synchronized § {
while(p.flag==true)//强制每个线程都有判断一次,如果不是while 相同线程就有问题
try {
p.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 此次消费的随机数
int count = (int) (Math.random() * (p.getProduct() + 1));
// 设置进此次消费数量
p.setProduct(p.getProduct() - count);
// 输出
System.out.println(“此次消费” + count + “,还剩” + p.getProduct() + “个…”);
//唤醒线程—随机唤醒
//p.notify();
p.notifyAll();
p.flag=true;

		}
		
	}
}

}

//商品类
class Pruduct{
//属性—商品个数
private int product;
boolean flag=true;
public int getProduct() {
return product;
}

public void setProduct(int product) {
	this.product = product;
}

}


多个相同线程执行,相同线程只走一遍代码

package cn.tedu.thread;

public class WaitNotifyAllDemo {

public static void main(String[] args) {
	Pruduct p=new Pruduct();
	//p.setProduct(100);
	//开启线程
	new Thread(new Productor(p)).start();
	new Thread(new Productor(p)).start();
	new Thread(new Consumer(p)).start();
	new Thread(new Consumer(p)).start();
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值