黑马程序员技术交流社区
标题: 黑马程序员----程序运行的海陆空---多线程 [打印本页]
作者: 毕延平 时间: 2015-3-10 18:22
标题: 黑马程序员----程序运行的海陆空---多线程
http://bbs.itheima.com/thread-3077-1-1.html
1、为什么需要使用多线程
1.)之前我们的程序都是顺序执行的,后面的代码都是要等前面的代码执行完毕,才能获得执行;
2.)有些时候,当一个应用程序在做一件事的时候,很可能需要同时做其它的事情。比如:控制台等待用户输入的时候,如果此时需要同时接收网络数据,这时就需要编程语言为我们提供这种机制;QQ程序:聊天窗口,程序在等待用户输入数据,此时它也需要同时接收网络数据;还要同时刷新好友列表;3.)所以很多程序都需要在做一件事情的时候,同时还要做其它的事情,这就需要编程语言提供这种机制。这种机制叫:多线程;
2、进程等概念定义
1)进程:一般来说一个应用程序开始运行,它就是一个主"进程"。它由操作系统管理;每一个进程都有它自己的内存空间和系统资源。
2)线程:是由某个进程单独启动的一个独立运行代码块。一个线程,一旦启动之后,同主进程一样,一起竞争系统资源。一个进程,可以开出很多的线程。
一个线程就是一个单独的执行路径。多个线程,就是多个执行路径,所有的这些执行路径同时竞争系统资源;
3)单线程:一个应用程序只有一条执行路径。(之前我们开发的所有程序)多线程:一个应用程序开出多个线程,也就是具有多个执行路径。
4).Java程序运行的原理:由虚拟机加载启动的main()方法所在类;同时,虚拟机在后台也会运行一些其他的程序:例如:垃圾回收器。java虚拟机也是一个多线程的程序;
5)并行是逻辑上同时发生,指在"某一个时间内"同时运行多个程序。并发是物理上同时发生,指在"某一个时间点"同时运行多个程序。
3、线程实现方式
线程的实现方式一 1.定义一个类,继承自java.lang.Thread2.重写里面的run()方法; 3.在测试类中,实例化自定义类的对象,并调用它的start()方法,启动一个线程;
Class A extends Thread{
Public void run(){
}
}
Class demo{
Main{ A t = new A(); t.stard();
}
}
线程的实现方式二: 1.定义一个类,实现Runnable接口;2.重写里面的run()方法 3.在测试类中:
Thread t = new Thread(自定义类对象引用); t.start();简化的写法:new Thread(自定义类对象引用).start();
Class A implements Runnable{
Public void run (){
}
}
Class demo {
Main(){ A t = new A(); Thread t1 = new Thread (t,”邓超”);
T1 .start();
} }
4、多线程 基础应用
(1):获取和设置线程的名称:
默认线程名称:Thread + 编号 : 编号从0开始,第一个启动的编号为0;
setName设置线程名称:
getName获取线程名称:
t1.setName("邓超") t2.setName("孙俪");
Syotem.out.print(t1 . getName());
(2)线程优先级:
1.当多个线程同时并行运行时,可以设置它们的优先级。
2.具有较高优先级的线程,可能会被操作系统分配更多的执行机会,可能会更早的执行完毕;4.Java中,线程的优先级级别:1-10:从低到高
t1.setName("线程1");t2.setName("线程2");
t1.setPriority(1);t2.setPriority(10);
(3)线程的休眠:Thread --> public static void sleep(long millis)
MyThread t = new MyThread();
try {//当前线程休眠Thread.sleep(1000);} catch (InterruptedException e) {
e.printStackTrace(); } } t.start();
(4)线程的加入:Thread --> public final void join():等待该线程终止。
t1.setName("兵1");t2.setName("兵2");t1.start();//可以让t1先冲,先去杀敌,你杀完,我再杀try {t1.join();} catch(InterruptedException e) {e.printStackTrace();} t2.start();
(5)线程的礼让:public static void yield():暂停当前正在执行的线程对象,并执行其他线程。此方法将当前线程退回到"就绪"状态,意味着同其他的线程再次站在同一起跑线上,由操作系统决定分配CPU资源,也很有可能会yield()之后,会马上被分配到CPU时间。
(6)默认情况下,当前进程开出的所有线程都是"非守护线程":当主进程结束,会等待所有线程结束,应用程序才会结束;让开出的线程作为"守护线程":Thread -->public final void setDaemon(boolean on):如果为true,为守护线程守护线程:当主进程结束时,所有的"守护线程"也会结束。(但不会立即结束,通常会有个小缓冲)
MyThread t1 = new MyThread();
MyThread t2 = new MyThread();
t1.setDaemon(true);
t2.setDaemon(true);
(7)停止线程:
public final void stop():
public void interrupt():
MyThread t = new MyThread();
t.start();t.interrupt();
作者: IT未来 时间: 2015-3-11 11:49
加油,路过。
作者: 毕延平 时间: 2015-3-11 14:23
恩 帮忙 转转 技术分 我头疼死了
作者: IT未来 时间: 2015-3-11 15:08
你打算进哪一期啊?我也急啊,我想进3月22的
作者: 位喜 时间: 2015-3-13 21:54
还没看到这 ,路过
作者: 毕延平 时间: 2015-3-16 20:02
嗯 ,求指导。怎么加快技术分的获得
作者: 位喜 时间: 2015-3-16 22:31
发技术贴,
作者: 位喜 时间: 2015-3-20 22:00
多写点博客
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |