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();
}
}