> 文章列表 > Java多线程初级学习总结

Java多线程初级学习总结

Java多线程初级学习总结

Java多线程初级学习总结

  • 一.Java创建线程的几种方法
  • 二.Thread类常用方法
  • 三.sleep方法与wait方法的区别
  • 四.start方法与run方法的区别
  • 五.Synchronized与Lock的区别
  • 附录

一.Java创建线程的几种方法

  1. 继承Thread类
public class MyThread extends Thread {@Overridepublic void run() {super.run();System.out.println("你好");}
}
------------------------------------------------
public class ThreadTest {public static void main(String[] args) {MyThread myThread = new MyThread();myThread.start();}
}
  1. 实现Runnable接口
public class MyThread1 implements Runnable {@Overridepublic void run() {System.out.println("你好");}
}--------------------------------------------------
public class MyThread1Test {public static void main(String[] args) {MyThread1 myThread1 = new MyThread1();Thread thread = new Thread(myThread1);thread.start();}
}
  1. 实现Callable接口
public class MyThread3 implements Callable<String> {@Overridepublic String call() throws Exception {return "hello";}
}--------------------------------------------------
public class Thread3Test {public static void main(String[] args) throws ExecutionException, InterruptedException {MyThread3 myThread3 = new MyThread3();FutureTask futureTask = new FutureTask(myThread3);new Thread(futureTask).start();System.out.println(futureTask.get());}
}
  1. 使用线程池
public class TestCallable implements Callable<String> {@Overridepublic String call() throws Exception {return "通过线程池实现多线程";}
}
--------------------------------------------------
public class NewTest {public static void main(String[] args) throws ExecutionException, InterruptedException {TestCallable testCallable = new TestCallable();ExecutorService executorService = Executors.newFixedThreadPool(3);// 提交任务Future<String> future = executorService.submit(testCallable);String result = future.get();System.out.println(result);}
}

二.Thread类常用方法

  1. join方法
    A线程调用B线程的Join方法,将会使A等待B执行直到等待B线程终止,如果传入time参数将会使A等待B执行time时间,如果time时间到达,将会切换进A线程继续执行A线程。
  2. yield方法
    yield方法:当前线程放弃CPU的使用切换其他线程使用,执行此方法会向系统线程调度器(scheduler)发出一个暗示,告诉当前Java线程打算放弃对CPU的使用,但该暗示有可能被调度器忽略。
  3. interrupt方法
    该方法终端当前线程的执行,允许当前线程对自身进行终端,否则将会校验调用方法线程是否有该线程的权限。
  4. interrupted
    查看当前线程是否处于中断状态,该方法特殊之处在于如果调用成功,当前线程的interrupt status清除。所以如果连续两次调用该方法第二次返回false
  5. stop(已过时)
    由于stop方法可以让一个线程A终止掉另一个线程B,被终止的线程B会立即释放锁,这可能会使对象处于不一致状态。

三.sleep方法与wait方法的区别

  1. sleep方法属于Thread类,而wait方法属于Object类中的。
  2. sleep方法导致程序暂停给了暂停时间,让出CPU给其他线程,但他的监控状态依旧保持着,到了时间又会恢复运行状态。
  3. 在调用sleep方法的过程中线程不会释放掉锁对象。
  4. 当调用wait方法时,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后,该线程才进入对象锁定池,准备获取对象锁进入运行状态。

四.start方法与run方法的区别

  1. start方法用来启动线程真正实现了多线程运行。这时无需等待run方法执行完毕可以继续执行下面的代码。
  2. 通过调用Thread类的start方法来启动一个线程,此时线程是处于就绪状态并没有运行。
  3. 方法run()称为线程体,包含了要执行的这个线程的内容,线程进入了运行状态,开始运行run函数中的代码,run()方法运行结束,此时线程终止,然后CPU再调度其他线程。

五.Synchronized与Lock的区别

  1. Synchronized是Java内置的关键字,Lock是Java的一个类。
  2. Synchronized无法获取锁的状态,Lock可以判断是否获取到了锁。
  3. Synchronized会自动释放锁,Lock必须手动释放锁!如果不释放会造成死锁。
  4. Synchronized 线程1(获取锁,阻塞),线程2(等待,傻傻的等待),Lock锁就不一定会等下去。
  5. Synchronized可重入锁,不可中断,非公平的,Lock锁是可重入的锁,公平不公平可以设置。

附录

1.并发编程