黑马程序员_多线程1,黑马程序员多线程
黑马程序员_多线程1,黑马程序员多线程
----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
<span >package cn.itcast_01;
public static void main(String[] args){
Mythread yulongchao=new MyThread();
Thread yulongchao2=new Thread(yulongchao);
while(true){
System.out.println("这是我的第一个程序");
}
}
public static MyThread implements Runnable(){
public void run(){
System.out.println("这是我的第二个程序");
}
}
</span>
首先我们通过这个多程序来了解,如果是第一程序一直执行的话,并且是死循环
最终的后果只能是内存溢出,如果是用户要求能够在执行第一个死循环的话,同时执行第二个
死循环的话,那就从这个地方引出线程,
线程的英文表示Thread。
多线程:一个应用程序有多条执行路径。
*
* 进程:就是正在运行的应用程序。
* 线程:是应用程序的执行路径,执行单元。
* 单线程:一个应用程序只有一条执行路径。
* 多线程:一个应用程序有多条执行路径。
*
* 举例:
* 迅雷下载。
*
* 吃饭。
* 单进程单线程:一个人吃一桌菜。
* 单进程多线程:多个人吃一桌菜。
*
* 我们现在要自己实现这样的一个程序,该怎么办呢?
* 首先,我们先为一个应用程序创建一个进程,然后呢,在把这个进程给开辟出多条执行路径。这样就能实现。
* 但是, 我们是做不了的。
* 因为进程是由系统创建的,而Java语言是不能操作操作系统的资源的。
* 所以,我们自己不能直接做这个事情。为了简化这个操作,
* java语言本身在底层做了这样的事情,然后直接给我们提供了一个线程的类供我们使用。
* 那么,这个类是什么呢?Thread。
*
* 通过查看API,我们知道模拟多线程程序有2种方案。
* 第一种方案:继承Thread类。
* 步骤:
* A:自定义类MyThread继承自Thread类。
* B:重写Thread类的run()方法。
* 为什么要重写该方法呢?
* 因为run()方法里面封装的代码才是被线程执行的代码。
* C:在测试类中,创建MyThread类对象。
* D:运行程序。
* 怎么运行呢?
* 不能直接调用run()方法运行,否则,它会把run()方法当作普通的方法运行。
* 这个时候,必须要有一个动作,开启线程,然后它才可以去调用run()方法。
*
* 调用start()运行。
*
<span >public class MyThreadDemo {
public static void main(String[] args) {
// 方式1:错误做法
// MyThread my = new MyThread();
// // 运行
// my.run();
// my.run();
// 方式2:错误做法
// MyThread my1 = new MyThread();
// MyThread my2 = new MyThread();
// my1.run();
// my2.run();
// 方式3:正确做法
MyThread my1 = new MyThread();
MyThread my2 = new MyThread();
my1.start();
my2.start();
}
}
</span>
如何获取线程名称呢?
<span >* public final String getName():获取线程名称。默认值:Thread-编号组成。从0开始。
* public final void setName(String name):更改线程名称。
public class MyThreadDemo {
public static void main(String[] args) {
// 通过无参+setXxx()
// // 创建线程对象
// MyThread my1 = new MyThread();
// MyThread my2 = new MyThread();
// // 更改线程名称
// my1.setName("于龙超1");
// my2.setName("于龙超2");
// 通过带参构造方法
MyThread my1 = new MyThread("于龙超1");
MyThread my2 = new MyThread("于龙超2");
// 启动线程
my1.start();
my2.start();
}
}
</span>
实现了接口的类本身不是一个线程类,仅仅是封装了被线程执行的代码。
所以,它不能直接使用getName()方法。
针对这种情况,Threa的提供了另外的一种方式:
<span >public static Thread currentThread():返回对当前正在执行的线程对象的引用。
public class MyRunnable implements Runnable {
@Override
public void run() {
for (int x = 0; x < 100; x++) {
System.out.println(Thread.currentThread().getName() + "---" + x);
}
}
}
</span>
方式2:实现Runnable接口。
步骤:
A:自定义类MyRunnable实现Runnable接口。
B:重写run()方法。
C:创建MyRunnable的对象。
D:创建Thread类的对象,并把MyRunnable的对象作为参数传递。
<span >public class MyRunnableDemo {
public static void main(String[] args) {
// 创建MyRunnable的对象
MyRunnable my = new MyRunnable();
// 创建Thread类的对象,并把MyRunnable的对象作为参数传递。
// Thread(Runnable target)
// Thread t1 = new Thread(my);
// Thread t2 = new Thread(my);
// Thread(Runnable target, String name)
Thread t1 = new Thread(my, "于龙超1");
Thread t2 = new Thread(my, "于龙超2");
t1.start();
t2.start();
}
}
</span>
----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
相关文章
- 暂无相关文章
用户点评