Java–多线程的创建
博客说明
文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢!
创建方法一(Thread)
自定义线程类
package www;
public class MyThread extends Thread{
// 重写run方法
@Override
public void run(){
for (int i = 0; i < 10; i++) {
System.out.println("run:"+i);
}
}
}
测试类
package www;
public class MyThreadTest {
public static void main(String[] args) {
//主线程
System.out.println("主线程");
MyThread mt = new MyThread();
mt.start(); //开启多线程
for (int i = 0; i < 10; i++) {
System.out.println("main:"+i);
}
}
}
Thread类
线程是程序中执行的线程。 Java虚拟机允许应用程序同时执行多个执行线程。
每个线程都有优先权。 具有较高优先级的线程优先于优先级较低的线程执行。
方法和说明 | 返回值 |
---|---|
getName() 返回此线程的名称。 |
String |
getPriority() 返回此线程的优先级。 |
int |
getStackTrace() 返回表示此线程的堆栈转储的堆栈跟踪元素数组。 |
StackTraceElement[] |
getState() 返回此线程的状态。 |
Thread.State |
getThreadGroup() 返回此线程所属的线程组。 |
ThreadGroup |
interrupt() 中断这个线程。 |
void |
join() 等待这个线程死亡。 |
void |
run() 如果这个线程使用单独的Runnable 运行对象构造,则调用该Runnable 对象的run 方法; 否则,此方法不执行任何操作并返回。 |
void |
sleep(long millis) 使当前正在执行的线程以指定的毫秒数暂停(暂时停止执行),具体取决于系统定时器和调度程序的精度和准确性。 |
static void |
sleep(long millis, int nanos) 导致正在执行的线程以指定的毫秒数加上指定的纳秒数来暂停(临时停止执行),这取决于系统定时器和调度器的精度和准确性。 |
static void |
start() 导致此线程开始执行; Java虚拟机调用此线程的run 方法。 |
void |
toString() 返回此线程的字符串表示,包括线程的名称,优先级和线程组。 |
String |
yield() 对调度程序的一个暗示,即当前线程愿意产生当前使用的处理器。 |
static void |
创建方法二(Runnable)
Runnable接口应由任何类实现,其实例将由线程执行。 该类必须定义一个无参数的方法,称为run
自定义线程类
package www;
public class MyRunnable implements Runnable{
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
}
测试类
package www;
public class MyRunnableTest {
public static void main(String[] args) {
MyRunnable run = new MyRunnable();
Thread t = new Thread(run);
t.start();
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
}
Thread和Runnable的区别
如果一个类继承Thread,则不适合资源共享。
但是如果实现了Runable接口的话,则很容易的实现资源共享。
实现Runnable接口比继承Thread类所具有的优势
适合多个相同的程序代码的线程去共享同一个资源。
可以避免java中的单继承的局限性。
增加程序的健壮性,实现解耦操作,代码可以被多个线程共享,代码和线程独立。
线程池只能放入实现Runable或Callable类线程,不能直接放入继承Thread的类。
扩充:在java中,每次程序运行至少启动2个线程。一个是main线程,一个是垃圾收集线程。因为每当使用 java命令执行一个类的时候,实际上都会启动一个JVM,每一个JVM其实在就是在操作系统中启动了一个进 程。
使用匿名内部类实现多线程
package www;
public class TestThread {
public static void main(String[] args) {
//使用Thread
new Thread(){
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
}.start();
//使用Runnable
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
}).start();
}
}
感谢
黑马程序员
以及勤劳的自己