A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马的学员 中级黑马   /  2015-8-8 21:14  /  362 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

创建线程方式二:实现Runnable接口

步骤:(1)定义runnable接口
(2)覆盖接口中的run方法,将线程的任务代码封装到run方法中。
(3)通过Thread类创建线程对象,并将Runnable接口的子类对象作为Thread类的构造函数的参数进行传递
(4)调用线程对象的start方法开启线程。
package test;
class Demo2 implements Runnable//实现runnable接口
{
        public void run(){  //覆盖run方法
                show();//调用show方法
        }
private void show() {
                // TODO Auto-generated method stub
                for(int i=0;i<3;i++){
                        System.out.println(Thread.currentThread().getName() + "..." + i);
                }
        }
        }
public class Demo1{
        public static void main(String[] args) {
                // TODO Auto-generated method stub
Demo2 d= new Demo2();//创建Demo2对象
Thread t1 = new Thread(d);//创建Thread类并将并将Runnable接口的子类对象做为参数传递
Thread t2 =new Thread(d);
t1.start();//开启线程
t2.start();
        }

}
运行结果如下:
Thread-0...0
Thread-0...1
Thread-0...2
Thread-1...0
Thread-1...1
Thread-1...2
实现Runnable接口的好处:
1. 将线程的任务从线程的子类中分离出来,进行了单独的封装,按照面向对象的思想将任务封装成对象。
2. 避免了Java单继承的局限性。 所以,创建线程的第二种方式较为常用。
线程安全问题
根据卖票例子可以发现,Thread-0通过了if判断后,在执行到“ num--” 语句之前,num此时仍等于1。CPU切换到Thread-1、 Thread-2、 Thread-3之后,这些线程依然可以通过if判断,从而执行“ num--” 的操作,因而出现了0、 -1、 -2的情况。
线程安全问题产生的原因:
1. 多个线程在操作共享的数据。
2. 操作共享数据的线程代码有多条。
当一个线程在执行操作共享数据的多条代码过程中,其他线程参与了运算,就会导致线程安全问题的产生。
线程安全问题的解决方案
(1)在java中,用同步代码块就可以解决这个问题。
同步代码块的格式:
synchronized(对象){
需要被同步的代码;
} 同步的好处:解决了线程的安全问题。
同步的弊端:当线程相当多时,因为每个线程都会去判断同步上的锁,这是很耗费资源的,无形中会降低程序的运行效率。
同步的前提:必须有多个线程并使用同一个锁。
(2)格式:在函数上加上synchronized修饰符即可。
注:同步的目的就是加上锁,谁符合条件就进去执行任何锁上别的线程就进不来了 等到运行结束后再打开锁让这些线程再去抢cup。

3 个回复

正序浏览
黑马的学员 发表于 2015-8-8 21:33
我想水点黑马币 你技术分好高啊

之前黑马有一个四周年的庆典活动,做题给技术分,我参与了,给了9技术分,经常关注一下黑马的官方活动吧,好多赠技术分,黑马币的
回复 使用道具 举报
薛瑞宾 发表于 2015-8-8 21:15
线程还没学,不过看着写的挺好

我想水点黑马币 你技术分好高啊
回复 使用道具 举报
线程还没学,不过看着写的挺好
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马