- 1、线程、进程:
进程:是一个具有一定独立功能的程序,每一个进程都有自己的地址空间。
线程:是进程的一个执行路径,共享一个内存空间,线程之间可以*切换,并发执行,一个进程至少有一个线程(单线程程序)
进程有三种基本状态:就绪、执行、阻塞
2、线程中常见的方法:
- Thread(Runnable target)
- Thread(Runnable target,String name);
- String getName();// 返回该线程的名称。
- void join();//等待线程终止
- boolean isDaemon();//将该线程标记为守护线程或用户线程。
- void yield();//暂停当前正在执行的线程对象,并执行其他线程。该方法必须在启动线程前调用。
- isAlive() 测试线程是否处于活动状态。
setPriority();优先级
start()使该线程开始执行;Java 虚拟机调用该线程的 run 方法。
结果是两个线程并发地运行;当前线程(从调用返回给 start 方法)和另一个线程(执行其 run 方法)。 多次启动一个线程是非法的。特别是当线程已经结束执行后,不能再重新启动。- void sleep();//
在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),还会受到系统时间的影响。该线程不丢失任何监视器的所属权。
当CPU分配给该进程1s时间时,进程中的两个线程0、1开始抢夺资源,若线程0抢占到时间执行,在线程0中有 sleep(1000);在这个过程中,线程0是不会释放这个CPU的资源的。即:就算当前线程在休眠,也不会丢失任何监视器的所属权。
实例代码:
package com.xiaofeng.example;
/**
* 线程的两种用法:Thread(继承类) 、 Runnable(实现接口)
*/
public class ThreadDemo {
public static void main(String[] args) {
MyThread t1 = new MyThread();
// 设置抢占CPU执行时间的优先级(知识几率,但不一定)
// t1.setPriority(Thread.MAX_PRIORITY);
// 把t1设置为守护线程
t1.setDaemon(true);
t1.start();
MyRunnable myRunnable = new MyRunnable();
Thread t2 = new Thread(myRunnable);
t2.start();
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName() + "-- " +i);
try {
t1.sleep(1000);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
if (i == 6) {
/*try {
// 等待该线程被终止
// 此处的含义是, 当i==6时等待t1执行完再执行自己的线程(main)
t1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}*/
}
}
}
static class MyThread extends Thread {
@Override
public void run() {
super.run();
for (int i = 0; i < 10; i++) {
try {
// 在指定的毫秒数内让当前正在执行的线程休眠(暂停执行)。该线程不丢失任何监视器的所属权。
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " --" + System.currentTimeMillis() + "-- " +i);
}
}
}
static class MyRunnable implements Runnable {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
try {
// 在指定的毫秒数内让当前正在执行的线程休眠(暂停执行)。该线程不丢失任何监视器的所属权。
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " --" + System.currentTimeMillis() +"-- " +i);
}
}
}
}