创建多线程的方式及代码
package com.atguigu.java2; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; /*创建多线程的方式: 1.继承Thread 2.实现Runnable 3.实现Callable 4.使用线程池 */ class MyThread01 extends Thread { @Override public void run() { System.out.println("-----MyThread01"); } } class MyThread02 implements Runnable { public void run() { System.out.println("-----MyThread02"); } } class MyThread03 implements Callable<Integer> { @Override public Integer call() throws Exception { System.out.println("-----MyThread03"); return 200; } } public class ThreadNew { public static void main(String[] args) { new MyThread01().start(); new Thread(new MyThread02()).start(); FutureTask<Integer> futureTask = new FutureTask<Integer>(new MyThread03()); new Thread(futureTask).start(); try { Integer value = futureTask.get(); System.out.println(value); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } } }
线程池代码:
package com.atguigu.interview; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; //创建并使用多线程的第四种方法:使用线程池 class MyThread implements Runnable { @Override public void run() { for (int i = 1; i <= 100; i++) { System.out.println(Thread.currentThread().getName() + ":" + i); } } } public class ThreadPool { public static void main(String[] args) { // 1.调用Executors的newFixedThreadPool(),返回指定线程数量的ExecutorService ExecutorService pool = Executors.newFixedThreadPool(10); // 2.将Runnable实现类的对象作为形参传递给ExecutorService的submit()方法中,开启线程 // 并执行相关的run() pool.execute(new MyThread()); pool.execute(new MyThread()); pool.execute(new MyThread()); // 3.结束线程的使用 pool.shutdown(); } }
死锁
package com.atguigu.java; class A { public synchronized void foo(B b) { System.out.println("当前线程名: " + Thread.currentThread().getName() + " 进入了A实例的foo方法"); // ① try { Thread.sleep(200); } catch (InterruptedException ex) { ex.printStackTrace(); } System.out.println("当前线程名: " + Thread.currentThread().getName() + " 企图调用B实例的last方法"); // ③ b.last(); } public synchronized void last() { System.out.println("进入了A类的last方法内部"); } } class B { public synchronized void bar(A a) { System.out.println("当前线程名: " + Thread.currentThread().getName() + " 进入了B实例的bar方法"); // ② try { Thread.sleep(200); } catch (InterruptedException ex) { ex.printStackTrace(); } System.out.println("当前线程名: " + Thread.currentThread().getName() + " 企图调用A实例的last方法"); // ④ a.last(); } public synchronized void last() { System.out.println("进入了B类的last方法内部"); } } public class DeadLock implements Runnable { A a = new A(); B b = new B(); public void init() { Thread.currentThread().setName("主线程"); // 调用a对象的foo方法 a.foo(b); System.out.println("进入了主线程之后"); } public void run() { Thread.currentThread().setName("副线程"); // 调用b对象的bar方法 b.bar(a); System.out.println("进入了副线程之后"); } public static void main(String[] args) { DeadLock dl = new DeadLock(); new Thread(dl).start(); dl.init(); } }
线程锁:
package com.atguigu.interview; import java.util.concurrent.locks.ReentrantLock; class Window implements Runnable{ int ticket = 100; private final ReentrantLock lock = new ReentrantLock(); public void run(){ while(true){ try{ lock.lock(); if(ticket > 0){ try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(ticket--); }else{ break; } }finally{ lock.unlock(); } } } } public class ThreadLock { public static void main(String[] args) { Window t = new Window(); Thread t1 = new Thread(t); Thread t2 = new Thread(t); t1.start(); t2.start(); } }