面试笔记

1、写两个线程,一个线程打印数字,一个线程打印字母,且交替打印,打结果为:A12B34C56D78E910F1112G1314H1516I1718J1920K2122L2324M2526N2728O2930P3132Q3334R3536S3738T3940U4142V4344W4546X4748Y4950Z5152
代码如下:
锁控制实体类Suo:
public class Suo {
public boolean charIsDo=false;//主要用于先执行线程1,先打字母
public boolean isCharIsDo() {
return charIsDo;
}
public void setCharIsDo(boolean charIsDo) {
this.charIsDo = charIsDo;
}
}
线程1:
public class ThreadTest1 implements Runnable{
private Suo suo;
public int currentIndex=0;

public ThreadTest1(){
}
public ThreadTest1(Suo suo){
this.suo=suo;
}

@Override
public void run() {
synchronized(suo) {
while(true){
if(currentIndex>=26){
suo.notify();//中断本线程前要通知其它线
break;//中断,退出此线程
}
System.out.print((char)(currentIndex+65));
currentIndex++;
suo.setCharIsDo(true);
try {
suo.notify();
suo.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
线程2:
public class ThreadTest2 implements Runnable{
private Suo suo;
public int currentIndex=0;

public ThreadTest2(){
}
public ThreadTest2(Suo suo){
this.suo=suo;
}

public void run() {
synchronized(suo) {
while(true){
if(!suo.isCharIsDo()){//优先打字母
try {
suo.notify();
suo.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}

if(currentIndex>=52){
suo.notify();//中断本线程前要通知其它线程
break;//中断,退出此线程
}
currentIndex++;
System.out.print(currentIndex);
currentIndex++;
System.out.print(currentIndex);
try {
suo.notify();
suo.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
测试Main方法代码:
public class Main {
public static void main(String[] args) {
Suo suo = new Suo();//锁
ThreadTest1 test1=new ThreadTest1(suo);
ThreadTest2 test2=new ThreadTest2(suo);
Thread thead1=new Thread(test1);
thead1.start();
Thread thead2=new Thread(test2);
thead2.start();
}

}


2、实际开发中,我们不是将整个对象锁住了,其他线程想要执行这个类中的其它用Synchronized方法声明的方法都不可以了,因为想要进入其它的synchronized

方法也要先获得这个对象的锁,所以这种方法比较霸道,我们不建议这么做,所以出现了第二种方法,添加临时对象锁,就是针对每个synchronized方法,都有一个临时对象Object,如下面的代码

线程代码

public class ThreadTest implements Runnable {
   private int cur=0;

public void run() {
this.printTest();
}

Object lock=new Object();//临时变量锁
public void printTest(){
synchronized (lock) {
while(true){
if(cur>20){
lock.notify();
break;
}
Thread currentThread=Thread.currentThread();
System.out.println(currentThread.getName()+":"+cur++);
try {
lock.notify();
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}

测试代码:
public class Main {
public static void main(String args[]){
ThreadTest thread1 = new ThreadTest();
Thread t1= new Thread(thread1);
Thread t2= new Thread(thread1);
t1.start();
t2.start();
}
}






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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值