黑马程序员技术交流社区

标题: 【广州校区】+【原创】synchronized原理 [打印本页]

作者: 余大麻    时间: 2019-11-14 13:07
标题: 【广州校区】+【原创】synchronized原理
多线程A. 并发的发展历史B. 线程C. Java 中如何应用线程
[Java] 纯文本查看 复制代码
public class Thread implements Runnable {
    @Override
    public void run() {
        if (target != null) {
            target.run();
        }
    }
}

[Java] 纯文本查看 复制代码
public class CallableDemo {
    public static void main(String[] args) throws Exception {
        ExecutorService threadPools = Executors.newFixedThreadPool(10);
        Future<String> future = threadPools.submit(new MyCallable());
        System.out.println(future.get());
        threadPools.shutdown();
    }

    static class MyCallable implements Callable<String> {
        @Override
        public String call() throws Exception {
            TimeUnit.SECONDS.sleep(2);
            return "HelloWorld!";
        }
    }
}

D. 实际应用
[Java] 纯文本查看 复制代码
@AllArgsConstructor
@Data
public class Request {
    private String name;
}

[Java] 纯文本查看 复制代码
public interface RequestProcessor {
    void processRequest(Request request);
}

@AllArgsConstructor
@SuppressWarnings("all")
public class PrevProcessor extends Thread implements RequestProcessor {
    private final LinkedBlockingDeque<Request> requests = new LinkedBlockingDeque<>();
    private final RequestProcessor nextProcessor;

    @Override
    public void processRequest(Request request) {
        requests.add(request);
    }

    @Override
    public void run() {
        while (true) {
            try {
                Request request = requests.take();
                System.out.println("PreDataProcess: " + request.getName());
                if (nextProcessor != null) nextProcessor.processRequest(request);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

@AllArgsConstructor
@SuppressWarnings("all")
public class PrintProcessor extends Thread implements RequestProcessor {
    private final LinkedBlockingDeque<Request> requests = new LinkedBlockingDeque<>();
    private final RequestProcessor nextProcessor;

    @Override
    public void processRequest(Request request) {
        requests.add(request);
    }

    @Override
    public void run() {
        while (true) {
            try {
                Request request = requests.take();
                System.out.println("PrintData: " + request.getName());
                if (nextProcessor != null) nextProcessor.processRequest(request);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

@AllArgsConstructor
@SuppressWarnings("all")
public class SaveProcessor extends Thread implements RequestProcessor {
    private final LinkedBlockingDeque<Request> requests = new LinkedBlockingDeque<>();
    private final RequestProcessor nextProcessor;

    @Override
    public void processRequest(Request request) {
        requests.add(request);
    }

    @Override
    public void run() {
        while (true) {
            try {
                Request request = requests.take();
                System.out.println("SaveData: " + request.getName());
                if (nextProcessor != null) nextProcessor.processRequest(request);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

[Java] 纯文本查看 复制代码
public class MainTest {
    private RequestProcessor requestProcessor;

    "创建责任链"
    public MainTest() {
        SaveProcessor saveProcessor = new SaveProcessor(null);
        saveProcessor.start();
        PrintProcessor printProcessor = new PrintProcessor(saveProcessor);
        printProcessor.start();
        requestProcessor = new PrevProcessor(printProcessor);
        ((PrevProcessor) requestProcessor).start();

    }

    public static void main(String[] args) {
        MainTest mainTest = new MainTest();
        Request request = new Request("客户端数据包");
        mainTest.requestProcessor.processRequest(request);
        System.out.println("success!");
    }
}

并发基础A. 生命周期
[Java] 纯文本查看 复制代码
public class ThreadStatusDemo {
    public static void main(String[] args) {
        "TIME_WAITING"
        new Thread(() -> {
            try {
                TimeUnit.SECONDS.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }, "Time_Waiting").start();
        "WAITING,线程在 ThreadStatus 类锁上通过 wait 进行等待"
        new Thread(() -> {
            synchronized (ThreadStatusDemo.class) {
                try {
                    ThreadStatusDemo.class.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, "Waiting").start();
        "线程在 ThreadStatus 加锁后,不会释放锁"
        new Thread(new BlockThread(), "BlockDemo-01").start();
        new Thread(new BlockThread(), "BlockDemo-01").start();
        System.out.println(Thread.currentThread().getName());
    }

    static class BlockThread implements Runnable {
        @Override
        public void run() {
            synchronized (BlockThread.class) {
                try {
                    TimeUnit.SECONDS.sleep(Long.MAX_VALUE);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

B. 线程的生命周期
[Java] 纯文本查看 复制代码
public class InterruptDemo {
    private static int count = 0;

    public static void main(String[] args) throws InterruptedException {
        Thread subThread = new Thread(() -> {
            "默认情况下 isInterrupted 返回 false, 通过 thread.interrupt 变成了 true"
            while (!Thread.currentThread().isInterrupted()) count++;
            System.out.println("count: " + count);
        }, "Sub_Thread");
        subThread.start();
        TimeUnit.SECONDS.sleep(2);
        "阻断线程运行"
        subThread.interrupt();
    }
}

[Java] 纯文本查看 复制代码
public class InterruptDemo2 {
    private static int count = 0;

    public static void main(String[] args) throws InterruptedException {
        Thread subThread = new Thread(() -> {
            while (true) {
                if (Thread.currentThread().isInterrupted()) {
                    System.out.println("before: " + Thread.currentThread().isInterrupted());
                    "对线程进行复位,由 true 变成 false"
                    Thread.interrupted();
                    System.out.println("after: " + Thread.currentThread().isInterrupted());
                }
            }
        }, "Sub_Thread");
        subThread.start();
        TimeUnit.MILLISECONDS.sleep(1);
        "阻断线程运行"
        subThread.interrupt();
    }
}

其他的线程复位
[Java] 纯文本查看 复制代码
public class InterruptDemo3 {
    private static int count = 0;

    public static void main(String[] args) throws InterruptedException {
        Thread subThread = new Thread(() -> {
            while (!Thread.currentThread().isInterrupted()) count++;
            System.out.println("count: " + count);
        }, "Interrupt_Thread");
        subThread.start();
        TimeUnit.MILLISECONDS.sleep(1);
        subThread.interrupt();
        System.out.println(subThread.isInterrupted());
        // true
    }
}

@SuppressWarnings("all")
public class InterruptDemo4 {
    private static int count = 0;

    public static void main(String[] args) throws InterruptedException {
        Thread subThread = new Thread(() -> {
           while (!Thread.currentThread().isInterrupted()) {
               try {
                   TimeUnit.SECONDS.sleep(1);
               } catch (InterruptedException e) {
                   e.printStackTrace();
               }
               System.out.println(count);
           }
        }, "Interrupt_Thread");
        subThread.start();
        TimeUnit.MILLISECONDS.sleep(1);
        subThread.interrupt();
        System.out.println(subThread.isInterrupted());
        // false
    }
}

C. 补充











欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2