博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java 多线程学习笔记
阅读量:7240 次
发布时间:2019-06-29

本文共 4645 字,大约阅读时间需要 15 分钟。

1.多线程实现方式一:自定义一个类,继承Thread类,覆盖Thread类中继承来的run()方法。

//自定义类,继承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
{ 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
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();            }        }    }}

 

转载于:https://www.cnblogs.com/shijunzhang/p/4859672.html

你可能感兴趣的文章
Python解析XML
查看>>
第43条:返回零长度的数组或者集合,而不是null
查看>>
初识numpy的多维数组对象ndarray
查看>>
java代码随机数100个,10个一输出显示======
查看>>
初始化代码块
查看>>
函数参数自动解包
查看>>
门诊医嘱与收费相关的表
查看>>
sql优化方案
查看>>
图片合并
查看>>
HTML5 本地存储 localStorage、sessionStorage 的遍历、存储大小限制处理
查看>>
PHP 操作数据库乱码 以及调试
查看>>
01-Nginx配置参数优化
查看>>
html5-新增表单的小结details summary
查看>>
AFN实现文件上传
查看>>
嵌入式开发之zynq---Zynq PS侧sd驱动
查看>>
web html 防盗链
查看>>
WCF,WebAPI,WCFREST和WebService的区别
查看>>
(树形dp)鸡毛信问题 (fzu 1227)
查看>>
论文阅读笔记五十八:FoveaBox: Beyond Anchor-based Object Detector(CVPR2019)
查看>>
关于Cookie跨域的问题研究
查看>>