线程的定义
程序是指在电脑上运行的一个代码合集,而进程是程序的一部分,是正在运行的程序;线程则是进程中的单一的连续控制流程,就像是进程一个分支,解决一个问题的好多种方法或者说是通道之一,一个进程可以有很多同时进行的线程,线程结束进程比一定结束,而进程结束线程一定结束。
用star()方法来启动线程,main()方法是主线程。
线程的例子:
public class a {
public static void main(String[] args) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("子线程");
}
});
thread.start();
System.out.println("主线程");
}
}
运行结果:
主线程
子线程
返例:
public class b {
public static void main(String[] args) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("子线程");
}
});
thread.run();
System.out.println("主线程");
}
}
运行结果:
子线程
主线程
线程的启动要用.start()方法,而不是调用run()方法。
实现线程我们一般都会用上面的方法实现Runable接口,还有一种实现线程的方法就是继承Thread类、重写run()方法,然后实例化类、对象.start()来启动线程。
例:
public class C extends Thread{
@Override
public void run(){
System.out.println("子线程");
}
public static void main(String[] args) {
System.out.println("主线程");
C c = new C();
c.start();
}
}
多线程
一个进程下可以有好多的进程,而好多进程同时进行就是多线程,多个线程同时进行,那么到底是谁先执行谁后执行,这个取决于CPU的调度。
让我们来实现一个模拟5个售票窗口同时卖5张火车票的情景。
例:
public class A implements Runnable {
private int num = 5;
private int count = 100;
@Override
public void run() {
while (count > 0) {
if (num > 0) {
System.out.println(Thread.currentThread().getName()+"正在出售"+(num--)+"张票");
count--;
}
}
}
}
public class TestA {
public static void main(String[] args) {
A a = new A();
Thread thread = new Thread(a);
Thread thread2 = new Thread(a);
Thread thread3 = new Thread(a);
Thread thread4 = new Thread(a);
thread.start();
thread2.start();
thread3.start();
thread4.start();
}
}
运行结果:
多个线程同时进行就可能出现这种情况,线程0和线程4同时卖掉了第4张票;这就是资源共享时出现的资源分配不均,那么怎么样才能解决这种情况呢,就是加同步代码块或者是给run()方法用同步修饰符(synchronized)修饰。
public class A implements Runnable {
private int num = 5;
private int count = 100;
@Override
public void run() {
while (count > 0) {
synchronized (this) {
if (num > 0) {
System.out.println(Thread.currentThread().getName() + "正在出售" + (num--) + "张票");
count--;
}
}
}
}
}
public class TestA {
public static void main(String[] args) {
A a = new A();
Thread thread = new Thread(a);
Thread thread2 = new Thread(a);
Thread thread3 = new Thread(a);
Thread thread4 = new Thread(a);
thread.start();
thread2.start();
thread3.start();
thread4.start();
}
}
输出结果:
或者是给Run()方法加修饰符
public class A implements Runnable {
private int num = 5;
private int count = 100;
@Override
public synchronized void run() {
while (count > 0) {
if (num > 0) {
System.out.println(Thread.currentThread().getName() + "正在出售" + (num--) + "张票");
count--;
}
}
}
}
运行结果和上面一样