每一个正在系统上运行的程序都是一个进程。每一个进程包含一到多个线程。线程是一组指令的集合,或者是程序的特殊段,它能够在程序里独立执行。也能够把它理解为代码运行的上下文。因此线程基本上是轻量级的进程,它负责在单个程序里执行多任务。一般由操做系统负责多个线程的调度和执行数据库
使用线程能够把占据时间长的程序中的任务放到后台去处理,程序的运行速度可能加快,在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种状况下能够释放一些珍贵的资源如内存占用等等。api
若是有大量的线程,会影响性能,由于操做系统须要在它们之间切换,更多的线程须要更多的内存空间,线程的停止须要考虑其对程序运行的影响。一般块模型数据是在多个线程间共享的,须要防止线程死锁状况的发生。网络
总结:进程是全部线程的集合,每个线程是进程中的一条执行路径。多线程
多线程提升程序执行效率。如: 迅雷多线程下载、数据库链接池、分批发送短信等。ide
/**
*
* @classDesc: 功能描述:(建立多线程例子-Thread类 重写run方法)
*/
class CreateThread extends Thread {
// run方法中编写 多线程须要执行的代码
public void run() {
for (inti = 0; i< 10; i++) {
System.out.println("i:" + i);
}
}
}
public class ThreadDemo {
public static void main(String[] args) {
System.out.println("-----多线程建立开始-----");
// 1.建立一个线程
CreateThread createThread = new CreateThread();
// 2.开始执行线程 注意 开启线程不是调用run方法,而是start方法
System.out.println("-----多线程建立启动-----");
createThread.start();
System.out.println("-----多线程建立结束-----");
}
}复制代码
/**
*
* @classDesc: 功能描述:(建立多线程例子-Thread类 重写run方法)
*/
class CreateRunnable implements Runnable {
@Override
publicvoid run() {
for (inti = 0; i< 10; i++) {
System.out.println("i:" + i);
}
}
}
/**
*
* @classDesc: 功能描述:(实现Runnable接口,重写run方法)
*/
public class ThreadDemo2 {
public static void main(String[] args) {
System.out.println("-----多线程建立开始-----");
// 1.建立一个线程
CreateRunnable createThread = new CreateRunnable();
// 2.开始执行线程 注意 开启线程不是调用run方法,而是start方法
System.out.println("-----多线程建立启动-----");
Thread thread = new Thread(createThread);
thread.start();
System.out.println("-----多线程建立结束-----");
}
}复制代码
public class ThreadDemo3 {
public static void main(String[] args) {
Thread thread = new Thread(new Runnable() {
public void run() {
for (int i = 0; i< 10; i++) {
System.out.println("i:" + i);
}
}
});
thread.start();
}
}
复制代码
使用实现实现Runnable接口好,缘由实现了接口还能够继续继承,继承了类不能再继承。函数
经常使用线程api方法性能
start() 启动线程spa
currentThread() 获取当前线程对象操作系统
getID() 获取当前线程ID Thread-编号 该编号从0开始线程
getName() 获取当前线程名称
sleep(long mill) 休眠线程
Stop() 中止线程,
经常使用线程构造函数
Thread() 分配一个新的 Thread 对象
Thread(String name) 分配一个新的 Thread对象,具备指定的 name正如其名。
Thread(Runable r) 分配一个新的 Thread对象
Thread(Runable r, String name) 分配一个新的 Thread对象
Java中有两种线程,一种是用户线程,另外一种是守护线程。
用户线程是指用户自定义建立的线程,主线程中止,用户线程不会中止
守护线程当进程不存在或主线程中止,守护线程也会被中止。
使用setDaemon(true)方法设置为守护线程
thread.setDaemon(true)
当在主线程当中执行到t1.join()方法时,就认为主线程应该把执行权让给t1
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(10);
} catch (Exception e) {
}
System.out.println(Thread.currentThread().getName() + "i:" + i);
}
}
});
t1.start();
// 当在主线程当中执行到t1.join()方法时,就认为主线程应该把执行权让给t1
t1.join();
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(10);
} catch (Exception e) {
}
System.out.println("main" + "i:" + i);
}复制代码
现代操做系统基本采用时分的形式调度运行的线程,线程分配获得的时间片的多少决定了线程使用处理器资源的多少,也对应了线程优先级这个概念。在JAVA线程中,经过一个int priority来控制优先级,范围为1-10,其中10最高,默认值为5。下面是源码(基于1.8)中关于priority的一些量和方法。
class PrioritytThread implements Runnable {
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().toString() + "---i:" + i);
}
}
}
/**
*
* @classDesc:
*/
public class ThreadDemo4 {
public static void main(String[] args) {
PrioritytThread prioritytThread = new PrioritytThread();
Thread t1 = new Thread(prioritytThread);
Thread t2 = new Thread(prioritytThread);
t1.start();
// 注意设置了优先级, 不表明每次都必定会被执行。 只是CPU调度会有限分配
t1.setPriority(10);
t2.start();
}
}复制代码
Thread.yield()方法的做用:暂停当前正在执行的线程,并执行其余线程。(可能没有效果)yield()让当前正在运行的线程回到可运行状态,以容许具备相同优先级的其余线程得到运行的机会。所以,使用yield()的目的是让具备相同优先级的线程之间可以适当的轮换执行。可是,实际中没法保证yield()达到让步的目的,由于,让步的线程可能被线程调度程序再次选中。结论:大多数状况下,yield()将致使线程从运行状态转到可运行状态,但有可能没有效果。