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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 卑微の小幸福 中级黑马   /  2013-11-13 00:40  /  907 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

当多条语句在操作同一线程共享数据时就产生了多线程!

一、在java中,都是可以多线程工作的,所以看看这多线程的意义:
1、多个线程并发可以提高程序的效率,可以同时完成多像工作。
2、一个进程中可以包含多条线程。

二、创建线程有两中方式
1、继承Thread类
    步骤:首先定义继承Thread
             再是复写Thread类中的run方法。
             再在主函数中调用start(),

class Demo extends Thread{
     public void run() {
           System.out.println();
} }
class Test {
   public static void main(String[] args){
       Demo d = new Demo();
       d.start();
}
}
2、实现Runnable接口
    步骤:实现 Runnable接口
             复写Runnable中的run方法
             创建Thread对象
             创建Runnable子类对象,并作为参数传个Thread对象
            用Thread调用start();
class Demo implements Runnable {
     public void run() {
           System.out.println();
} }
class Test {
   public static void main(String[] args){
       Demo d = new Demo();
       Thread t = new Thread(d);
                t.start();
}
}
在运行过程中啊:
             其实不是真正的多线程,是cpu在一相当快的速度不断的切换每条线程。
             而且我i们的多线程运行,每次的运行效果是不同的,因为cpu选择那条线程运行的顺序是不固定的也就是有随机性。
             还有,我们在开启一个线程是 就会自动调用run方法哦。
这两种开启线程的方法到底哪种好呢?
  其实是各有长短的:
    继承Thread,可以直接使用Thread中的方法,并直接调用start()开启线程。代码简单,
                          但是,要是该类已经有父类了就会出现局限性。

    实现Runnable接口,可以多实现,多子类没有多的限定,但代码复杂,还要把子类对象作为参数传给Thread才能调用start()。


还有就是Thread中一些常用方法:
设置、获取线程名字:setName()、getName()
   获取当前在运行程序对象:Thread.currentThread()
     睡一定时间:Thread.sleep()
       setDaemon是守护线程,该线程不会单独,其他非守护线程都执行结束后, 自动退出
       

线程在执行时,多线程并行,但是我们会希望某段执行完在执行其他的,这样就有线程的同步问题
  同步代码快synchronized(类名.class){同步对象}//小括号中 非静态同步方法默认使用当前对象this作为锁对象

           同步的前提:
                A.必须有两个或两个以上的线程
                 B.必须保证同步的线程使用同一个锁。

还有就是死锁了。就是synchronized嵌套了,就会引起死锁,这个我们一定要避免。














































































































0 个回复

您需要登录后才可以回帖 登录 | 加入黑马