黑马程序员技术交流社区
标题:
【石家庄中心】多线程_介绍及使用
[打印本页]
作者:
水煮牛蛙
时间:
2018-4-23 15:45
标题:
【石家庄中心】多线程_介绍及使用
本帖最后由 小石姐姐 于 2018-4-25 15:57 编辑
多线程_介绍及使用
主方法main()是单线成的
* 多线程:
*
* 进程:当前正在运行的程序,一个应用程序在内存中的执行区域
* 线程:进程中的一个执行控制单元,执行路径
*
* 一个进程可以有一个线程,也可已有多个线程
*
* 单线成:安全性高,但是效率低
* 多线程:安全性低,但效率高
*
* 多线程案例:360,迅雷等.
------------------------------------------------------
* 两种创建线程的方式:
* 1.继承Thread类创建线程
* 2.实现Runnable接口创建线程
------------------------------------------------------
>>>>>> 线程创建方式 1 <<<<<<<<<<
/*
* 多线程的实现方式:
* 方式1:一种方法是将类声明为Thread 的子类.该子类应重写Tread 类的run方法.接下来可以分配并启动该子类的实例.
* 四部 1继承Tread--->2 重写run()方法--->3创建线程对象--->4调用start()方法,启动线程
*
* Thread
* <通过对象调用该方法>
* String getName() 返回该线程的名称
* <在方法内调用>
* void setName(String name) 改变线程名称,使之与参数name相同.
*
* CPU执行程序的随机性
* 1.多线程不是同时执行的,线程启动以后,CPU会在多个进程的多个线程之间来回切换执行,不是同时执行的.
* 2.多线程效率高的原因:
* 线程多的进程被执行的几率就大,所以多线程比单线程效率高.
*
*/
package com.jobday11;
public class 多线程的实现方式 {
public static void main(String[] args) {
//创建线程实例
MyThread mt = new MyThread();
//启动线程
mt.start();
mt.setName("苹果");
System.out.println("------------");
//启动第二个线程
MyThread mt2 = new MyThread();
mt2.start();
mt2.setName("橘子");
}
}
//创建一个类继承线程类
class MyThread extends Thread {
//重写run()方法
@Override
public void run(){
for(int i=0;i<100;i++){
System.out.println(getName()+"--"+i);//getName()获取线程名称
}
}
}
---------------------------------------------------------
>>>>>> 线程创建方式 2 <<<<<<<<<<
package com.jobday11;
/*
* 两种创建线程的方式:
* 1.继承Thread类创建线程
* 2.实现Runnable接口创建线程
*
* 多线程实现方式 2:
* 创建线程的另一种方法是:
* 1.声明实现Runnable 接口的类;
* 2.该类然后实现run方法.
* 3.创建该类的实例.
* 4.创建Tread时将实现Runnable的类作为参数来传递
* 5.启动线程
*
* Thread 的静态方法:
* static Thread currentThread()
* //返回对当前正在执行的线程对象的引用。
* //然后通过返回的线程对象来调用getName()方法,获取线程名字
*
* 既然有了继承Tread类来创建线程,那为何还要定义一个Runnable接口来创建线程?
* 原因:
* 类是但继承的,如果类继承了Tread,就不能继承其它的类了
*
* 下边案例中展现了第二种创建线程的方式:
* 1.可以公用Runnable子类对象
* 2.也可以不共用Runnable子类对象
*
*/
//创建实现Runnable接口的类
class MyThread1 implements Runnable{
int num;
//构造方法
public MyThread1(int num){
this.num = num;
}
@Override
public void run() {
for(int i=0;i<100;i++){
System.out.println(Thread.currentThread().getName()+"--"+i+"--"+this.num);
}
}
}
//测试类
public class 多线程的实现方式_2 {
public static void main(String[] args) {
// 方式02_01(); //不共用Runnable子类对象的方法
方式02_02(); //公用Runnable子类对象的方法
}
//公用Runnable子类对象的方法
private static void 方式02_02() {
//创建Runnable实现类的对象
MyThread1 mt = new MyThread1(100);
//将该对象最为参数传给Tread的构造
Thread t = new Thread(mt);
t.setName("苹果");
//启动线程
t.start();
//创建第二个线程
Thread t2 = new Thread(mt);
t2.setName("香蕉");
t2.start();
}
//不共用Runnable子类对象的方法
private static void 方式02_01() {
//创建Runnable实现类的对象
MyThread1 mt = new MyThread1(100);
//将该对象最为参数传给Tread的构造
Thread t = new Thread(mt);
t.setName("苹果");
//启动线程
t.start();
//创建第二个线程
MyThread1 mt2 = new MyThread1(200);
Thread t2 = new Thread(mt2);
t2.setName("香蕉");
t2.start();
}
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2