美文网首页
多线程编程面试题

多线程编程面试题

作者: 冰与河豚鱼 | 来源:发表于2018-10-29 18:58 被阅读0次
    public class ABC_Condition {
        private static Lock lock=new ReentrantLock();
        private static Condition con1=lock.newCondition();
        private static Condition con2=lock.newCondition();
        private static Condition con3=lock.newCondition();
        
        private static int count=0;
        static class ThreadA extends Thread {
            @Override
            public void run() {
                try {
                    lock.lock();
                    for(int i=0;i<10;i++) {
                        while(count%3==0) {
                            con1.await();
                            System.out.println("A");
                            count++;
                            con2.signal();
                        }
                    }
                }catch(InterruptedException e) {
                    e.printStackTrace();
                }finally {
                    lock.unlock();
                }
            }
        }
        
        static class ThreadB extends Thread {
            @Override
            public void run() {
                try {
                    lock.lock();
                    for(int i=0;i<10;i++) {
                        while(count%3==1) {
                            con2.await();
                            System.out.println("B");
                            count++;
                            con3.signal();
                        }
                    }
                }catch(InterruptedException e) {
                    e.printStackTrace();
                }finally {
                    lock.unlock();
                }
            }
        }
        
        static class ThreadC extends Thread {
            @Override
            public void run() {
                try {
                    lock.lock();
                    for(int i=0;i<10;i++) {
                        while(count%3==2) {
                            con3.await();
                            System.out.println("C");
                            count++;
                            con1.signal();
                        }
                    }
                }catch(InterruptedException e) {
                    e.printStackTrace();
                }finally {
                    lock.unlock();
                }
            }
        }
        
        public static void main(String[] args) throws InterruptedException {
            new ThreadA().start();
            new ThreadB().start();
            new ThreadC().start();
            
        }
    }
        
    
    public class ABC_Lock {
        private static Lock lock=new ReentrantLock();
        private static int state=0;
        
        static class ThreadA extends Thread{
            @Override
            public void run() {
                for(int i=0;i<10;i++) {
                    try {
                        lock.lock();
                        while(state%3==0) {
                            System.out.println("A");
                            state++;
                            i++;
                        }
                    }finally {
                        lock.unlock();
                    }
                }
            }
        }
        
        static class ThreadB extends Thread{
            @Override
            public void run() {
                for(int i=0;i<10;i++) {
                    try {
                        lock.lock();
                        while(state%3==1) {
                            System.out.println("B");
                            state++;
                            i++;
                        }
                    }finally {
                        lock.unlock();
                    }
                }
            }
        }
        
        static class ThreadC extends Thread{
            @Override
            public void run() {
                for(int i=0;i<10;i++) {
                    try {
                        lock.lock();
                        while(state%3==2) {
                            System.out.println("C");
                            state++;
                            i++;
                        }
                    }finally {
                        lock.unlock();
                    }
                }
            }
        }
        
        public static void main(String[] args) {
            new ThreadA().start();
            new ThreadB().start();
            new ThreadC().start();
        }
    }
    
    
    public class ConductAndConsume {
        public static void main(String[] args) {
            Student s=new Student();
            SetStudent ss=new SetStudent(s);
            GetStudent gs=new GetStudent(s);
            Thread t1=new Thread(ss,"生产者");
            Thread t2=new Thread(gs,"消费者");
            t1.start();
            t2.start();
            
    }
    }
    
    class Student{
        private String name;
        private int age;
        boolean flag;
        
        //生产者的功能,为student对象赋值
        public synchronized void set(String name,int age) {
            if(this.flag) {
                try {
                    this.wait();
                }catch(InterruptedException e) {
                    e.printStackTrace();
                }
            }
            this.name=name;
            this.age=age;
            this.flag=true;
            this.notify();
        }
        //消费者的功能,打印student对象
        public synchronized void get() {
            if(!this.flag) {
                try {
                    this.wait();
                }catch(InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println(name+"  "+age);
            this.flag=false;
            this.notify();
        }
    }
    class SetStudent implements Runnable{
        private Student s;
        private int x=0;
        public SetStudent(Student s) {
            this.s=s;
        }
        @Override
        public void run() {
            while(true) {
                if(x%2==0) {
                    s.set("zhangsan", 11);
                }else {
                    s.set("lisi", 22);
                }
                x++;
            }
            
        }
    }
    
    class GetStudent implements Runnable{
        private Student s;
        public GetStudent(Student s) {
            this.s=s;
        }
        @Override
        public void run() {
            while(true) {
                s.get();
            }
            
        }
    }
    
    //设计四个线程,其中两个线程每次对变量i加1,另外两个线程每次对i减1
    public class FourProcessAddSub{
        private int i=0;
        public static void main(String[] args) {
            FourProcessAddSub fp=new FourProcessAddSub();
            Add add=fp.new Add();
            Sub sub=fp.new Sub();
            for(int i=1;i<=2;i++) {
                new Thread(add,"线程"+i).start();
                new Thread(sub,"线程"+i).start();
            }
        }
    
    
    public synchronized void addOne() {
        i++;
        System.out.println(Thread.currentThread().getName()+"+1的值为:"+i);
    }
    public synchronized void subOne() {
        i--;
        System.out.println(Thread.currentThread().getName()+"-1的值为:"+i);
    }
    class Add implements Runnable {
    
        @Override
        public void run() {
            for(int i=0;i<10;i++) {
                addOne();
                try {
                    Thread.sleep(100);
                }catch(InterruptedException e) {
                    e.printStackTrace();
                }
            }
            
        }
      
    }
    
    class Sub implements Runnable{
        @Override
        public void run() {
            for(int i=0;i<10;i++) {
                subOne();
                try {
                    Thread.sleep(100);
                }catch(InterruptedException e) {
                    e.printStackTrace();
                }
            }
            
        }
    }
    }
    
    //子线程循环10次,主线程循环20次,接着子线程循环10次,主线程循环20次...如此反复循环50次
    public class Function {
        private boolean flag=false;
        
        Lock lock=new ReentrantLock();
        Condition con=lock.newCondition();
        
        public void sub() {
            lock.lock();
            try {
                while(flag) {
                    try {
                        con.await();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }       
            }
                for(int i=0;i<10;i++) {
                    System.out.println("sub:"+i);
                }
                flag=true;
                con.signal();
                }finally {
                lock.unlock();
            }
            
        }
        public synchronized void main() {
            lock.lock();
            try {
                while(!flag) {
                    try {
                        con.await();
                    }catch(InterruptedException e){
                        e.printStackTrace();
                    }
                }
                for(int i=0;i<20;i++) {
                    System.out.println("main"+i);
                }
                flag=false;
                con.signal();
            }finally {
                lock.unlock();
            }
        }
        
        
    
    }
    
    
    //用3个线程打印递增的数
    public class PrintNum3Process {
        public static void main(String[] args) {
            final Handler handler=new Handler();
            for(int i=0;i<3;i++) {
                new Thread(new Runnable() {
                    
                    @Override
                    public void run() {
                        for(int j=0;j<5;j++) {
                            handler.print(Thread.currentThread().getName());
                        }
                        
                    }
                },i+"").start();
            }
        }
    }
    class Handler{
        private int num=1;
        private int status=0;
        
        public synchronized void print(String nums) {
            int Index=Integer.parseInt(nums);
            while(Index!=status) {
                try {
                    this.wait();
                }catch(InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.print("Thread"+nums+":");
            for(int count =0;count<5;count++,num++) {
                if(count>0) {
                    System.out.print(",");
                }
                System.out.print(num);
            }
            System.out.println();
            status=(status+1)%3;
            this.notifyAll();
        }
    }
    
    
    //两个线程交替打印1-100
    public class PrintOneTOHundred implements Runnable {
        //设置一个全局变量,两个线程先后访问这个变量
        int i=1;
        @Override
        public void run() {
            // TODO Auto-generated method stub
            while(true) {
                synchronized(this) {
                    notify();
                    try {
                        Thread.currentThread().sleep(100);
                    }catch(InterruptedException e) {
                        e.printStackTrace();
                    }
                    if(i<=100) {
                        System.out.println(Thread.currentThread().getName()+":"+i);
                        i++;
                        try {
                            wait();
                        }catch(InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }
        public static void main(String[] args) {
            PrintOneTOHundred p=new PrintOneTOHundred();
            Thread t1=new Thread(p);
            Thread t2=new Thread(p);
            t1.setName("线程1");
            t2.setName("线程2");
            t1.start();
            t2.start();
        }
    }
    
    
    //交替打印a1b2c3d4
    public class PrintTwoNum {
     static final Object object=new Object();
     public static void main(String[] args) {
        new Thread(new Runnable() {
            String a[]= {"a","b","c","d"};
            @Override
            public void run() {
                for(int i=0;i<4;i++) {
                    synchronized(object) {
                        object.notify();
                        try {
                            object.wait();
                        }catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        System.out.println(a[i]);
                        object.notify();
                    }
                }
                
            }
        }).start();
        new Thread(new Runnable() {
            int a[]= {1,2,3,4};
            @Override
            public void run() {
                for(int i=0;i<4;i++) {
                    synchronized(object) {
                        object.notify();
                        try {
                            object.wait();
                        }catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        System.out.println(a[i]);
                        
                    }
                }
            }
        }).start();
    }
    }
    
    
    /*
     * 现有的程序代码模拟产生了16个日志对象,
     * 并且需要运行16秒,才能打印完这些日志,
     * 请在程序中增加4个线程去调用parseLog()方法来分头打印这16个日志对象,
     * 程序只需要运行4秒即可打印完这些日志对象
     */
    public class ProcessLog {
        public static void main(String[] args) {
            final BlockingQueue<String> quene=new ArrayBlockingQueue<>(16);
            for(int i=0;i<4;i++) {
                new Thread(new Runnable() {
                    
                    @Override
                    public void run() {
                        while(true) {
                            try {
                                parseLog(quene.take());
                            }catch(InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                        
                    }
                }).start();
            }
            System.out.println("begin:"+(System.currentTimeMillis()/1000));
            for(int i=0;i<16;i++) {
                final String log=" "+(i+1);
                {
                    try {
                        quene.put(log);
                    }catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
        public static void parseLog(String log) {
            System.out.println(log+":"+System.currentTimeMillis()/1000);
            try {
                Thread.sleep(1000);
            }catch(InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:多线程编程面试题

          本文链接:https://www.haomeiwen.com/subject/yvlitqtx.html