进程:正在进行中的程序。 每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元。
线程:就是进程中一个执行单元或执行情景或执行路径负责进程中程序执行的控制单元 。一个进程中至少要有一个线程。当一个进程中线程有多个时,就是多线程。
为什么要用多线程
1,让计算机"同时"做多件事情,节约时间。
2,后台运行程序,提高程序的运行效率.。
3,多线程可以让程序"同时"处理多个事情。
4,计算机cpu大部分时间处于空闲状态,浪费了cpu资源。
1.创建线程的两种方式:
方式一步骤:继承thread类
子类覆盖父类中的run方法,将线程运行的代码存放在run中。
建立子类对象的同时线程也被创建。
通过调用start方法开启线程。
public class threadtest extends thread{
private int i;
public void run() {
for (i = 0; i < 100; i++)
system.out.println(thread.currentthread().getname() + "-------"+ i);
}
public static void main(string[] args) {
demo d1 = new demo();
demo d2 = new demo();
d1.start();
d2.start();
for (int i = 0; i < 60; i++)
system.out.println(thread.currentthread().getname()+"----------" + i);
}
方式二步骤:实现runnable接口
子类覆盖接口中的run方法。
通过thread类创建线程,并将实现了runnable接口的子类对象作为参数传递给thread类的构造函数。
thread类对象调用start方法开启线程。
public class runnabletest implements runnable {
private int num = 100;
@override
while (true) {
if (num > 0) {
try {
thread.sleep(100);
} catch (interruptedexception e) {
e.printstacktrace();
}
system.out.println(thread.currentthread().getname() + "----->"
+ num--);
} else {
break;
}
}
public static void main(string args[]) {
runnabletest rt = new runnabletest();
thread t1 = new thread(rt, "新线程1");
thread t2 = new thread(rt, "新线程2");
thread t3 = new thread(rt, "新线程3");
t1.start();
t2.start();
t3.start();
2.两种创建方式的对比
runnable接口相对于继承thread类的好处:
1.适合多个相同程序代码的线程去处理同意资源的情况,把虚拟cpu(线程)同程序的代码,数据有效分离,较好的体现了面向对象的设计思想。
2.可以避免由于java的单继承特点带来的局限。当我们要将已经继承了某一个类的子类放入多线程中,由于一个类不能同时有两个父类,所以只能使用runnable接口方法。
3.有力与程序的健壮性,代码能给被多个线程共享,代码与数据是独立的。
线程的四种状态及其转换
同步代码块
1)同步的前提:
a.必须有两个或两个以上的线程
b.必须保证同步的线程使用同一个锁。必须保证同步中只能有一个线程在运行。
好处与弊端:解决了多线程的安全问题。多个线程需要判断锁,较为消耗资源。
object obj = new object();
synchronized (obj) {
if (num > 0) {
try {
thread.sleep(100);
} catch (interruptedexception e) {
e.printstacktrace();
}
system.out.println(thread.currentthread().getname()
+ "----->" + num--);
} else {
break;