java 多线程学习笔记
2015-10-07 23:50
429 查看
1.多线程实现方式一:自定义一个类,继承Thread类,覆盖Thread类中继承来的run()方法。
2.多线程实现方式二:自定义一个类,实现Runnable接口,实现其中的的run()方法。
方式二好处:可以避免由于java单继承带来的局限性。适合多个相同程序的代码去处理同一个资源的情况,把线程同程序的代码,数据有效分离,较好的体现了面向对象的设计思想。
3.多线程实现方式三:通过实现Callable接口,创建线程池的方式。
4.多线程的同步synchronized(同步代码块,同步方法)
5.多线程同步Lock(JDK5以后才有的)
//自定义类,继承Thread类 public class MyThread extends Thread { //重写类里对run()方法 @Override public void run() { for (int i = 0; i < 10; i++) { try { Thread.sleep(100); System.out.println(getName() + ":" + i); } catch (InterruptedException e) { e.printStackTrace(); } } } }
public static void main(String[] args) { //创建一个线程对象 MyThread myThread = new MyThread(); MyThread myThread1 = new MyThread(); myThread.start();//启动线程 myThread1.start(); //匿名内部类方式实现 new Thread() { @Override public void run() { //// TODO } }.start(); }
2.多线程实现方式二:自定义一个类,实现Runnable接口,实现其中的的run()方法。
方式二好处:可以避免由于java单继承带来的局限性。适合多个相同程序的代码去处理同一个资源的情况,把线程同程序的代码,数据有效分离,较好的体现了面向对象的设计思想。
//自定义类,实现Runnable接口 public class MyRunnable implements Runnable { @Override public void run() { for (int i = 0; i < 10; i++) { try { Thread.sleep(100); System.out.println(Thread.currentThread().getName() + ":" + i); } catch (InterruptedException e) { e.printStackTrace(); } } } }
public static void main(String[] args) { MyRunnable my = new MyRunnable(); Thread t1 = new Thread(my); Thread t2 = new Thread(my); t1.start();//启动线程 t2.start(); //匿名内部类方式实现 new Thread(new Runnable() { @Override public void run() { //// TODO } }).start(); }
3.多线程实现方式三:通过实现Callable接口,创建线程池的方式。
//Callable:是带泛型的接口,这里指定的泛型其实是call()方法的返回值类型 public class MyCallable implements Callable<Integer> { private int number; public MyCallable(int number) { this.number = number; } @Override public Integer call() throws Exception { int sum = 0; for (int i = 0; i <= number; i++) { sum += i; } return sum; } }
public static void main(String[] args) throws ExecutionException, InterruptedException { //创建线程池对象,创建两个线程对象。 ExecutorService pool = Executors.newFixedThreadPool(2); //可以执行Callable对象或者Runnable对象代表的线程 Future<Integer> future = pool.submit(new MyCallable(100));//带返回结果 pool.submit(new MyRunnable()); //匿名内部类 pool.execute(new Runnable() { @Override public void run() { //// TODO } }); Integer i = future.get(); System.out.println(i); //结束 pool.shutdown(); }
4.多线程的同步synchronized(同步代码块,同步方法)
public class MyRunnable implements Runnable { private int money = 100; @Override public void run() { doFunction(); } private void doFunction() { while (true) //同步代码块 synchronized (MyRunnable.clss) { if (money > 0) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + ":" + money--); } } } }
public class MyRunnable implements Runnable { private int money = 100; @Override public void run() { doFunction(); } //同步方法,这里是锁对象是this;如果方法是静态方法,锁对象是该类的字节码文件对象 private synchronized void doFunction() { while (true) if (money > 0) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + ":" + money--); } } }
5.多线程同步Lock(JDK5以后才有的)
public class MyRunnable implements Runnable { private int money = 100; //定义锁对象 private Lock lock = new ReentrantLock(); @Override public void run() { doFunction(); } private void doFunction() { while (true) { try { //加锁 lock.lock(); if (money > 0) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + ":" + money--); } } finally { //释放锁 lock.unlock(); } } } }
相关文章推荐
- Java类加载及变量初始化过程
- Eclipse调试的一些小技巧
- Java学习笔记———《单例模式的7种实现详解》
- Java笔记---正则表达式
- Windows平台的Eclipse-javaEE-mars相关配置
- Java新手如何学习Spring、Struts、Hibernate三大框架?(转)
- Java多线程死锁
- java作业2
- JavaWeb登陆成功后跳转到上一个页面
- Java中对变量范围转换引发的思考
- 有关Genymotion与eclipse的连接其他方法
- 其他对象(java基础)
- 关于abstract 与接口的比较
- 八大排序的java实现(上)
- Java优化
- Spring中Bean的Scope
- IntelliJ IDEA生成javadoc时乱码问题的解决
- eclipse安装图形界面插件
- ***4.34-游戏:剪刀石头布
- java