带你整理面试过程中关于多线程的编程问题

Posted 南淮北安

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了带你整理面试过程中关于多线程的编程问题相关的知识,希望对你有一定的参考价值。

文章目录

一、多线程打印10个数


class MyThread implements Runnable 
    int num = 1;

    @Override
    public void run() 
        for (int i = 0; i < 10; i++) 
            //对当前对象加锁
            synchronized (this) 
                //判断是否满足条件
                if (num <= 10) 
                    System.out.println(Thread.currentThread().getName() + " >>> " + num++);
                
            
        
    


public class Test 
    public static void main(String[] args) 
        MyThread myThread = new MyThread();
        Thread thread1 = new Thread(myThread, "A");
        Thread thread2 = new Thread(myThread, "B");
        thread1.start();
        thread2.start();
    


二、交替打印奇偶不加锁

import java.util.concurrent.ThreadPoolExecutor;

class MyThread 
    //控制 i 打印10次
    volatile int i = 1;
    //通过flag控制轮到哪个线程打印
    volatile int flag = 1;

    public void runThread() 
        //匿名类实现第一个线程
        Thread t1 = new Thread("A") 
            @Override
            public void run() 
                while (i <= 10) 
                    if (flag == 1) 
                        System.out.println(Thread.currentThread().getName() + " >>> " + i++);
                        flag++;
                    
                
            
        ;
        //第二个线程
        Thread t2 = new Thread("B") 
            @Override
            public void run() 
                while (i <= 10) 
                    if (flag == 2) 
                        System.out.println(Thread.currentThread().getName() + " >>> " + i++);
                        flag=1;
                    
                
            
        ;
        t1.start();
        t2.start();
    


public class Test 
    public static void main(String[] args) 
        MyThread myThread = new MyThread();
        myThread.runThread();
    


三、交替打印10个数不加锁

import java.util.concurrent.ThreadPoolExecutor;

class MyThread 
    //控制 i 打印10次
    volatile int i = 1;
    //通过flag控制轮到哪个线程打印
    volatile int flag = 1;

    public void runThread() 
        //匿名类实现第一个线程
        Thread t1 = new Thread("A") 
            @Override
            public void run() 
                while (i <= 10) 
                    if (flag == 1) 
                        System.out.println(Thread.currentThread().getName() + " >>> " + i++);
                        flag++;
                    
                
            
        ;
        //第二个线程
        Thread t2 = new Thread("B") 
            @Override
            public void run() 
                while (i <= 10) 
                    if (flag == 2) 
                        System.out.println(Thread.currentThread().getName() + " >>> " + i++);
                        flag++;
                    
                
            
        ;
        //第三个线程
        Thread t3 = new Thread("C") 
            @Override
            public void run() 
                while (i <= 10) 
                    if (flag == 3) 
                        System.out.println(Thread.currentThread().getName() + " >>> " + i++);
                        flag = 1;
                    
                
            
        ;
        t1.start();
        t2.start();
        t3.start();
    


public class Test 
    public static void main(String[] args) 
        MyThread myThread = new MyThread();
        myThread.runThread();
    

以上是关于带你整理面试过程中关于多线程的编程问题的主要内容,如果未能解决你的问题,请参考以下文章

带你整理面试过程中关于Java 中多线程的创建方式的最全整理

带你整理面试过程中关于JVM 的运行机制多线程和 JVM 的内存区域的相关知识点

带你整理面试过程中关于ThreadLocal的相关知识

带你整理面试过程中关于 JVM 中分代收集算法分区收集算法和垃圾收集器的相关知识

带你整理面试过程中关于 Java 中的集合 List,Queue,Set的相关知识点

带你整理面试过程中关于锁升级的过程