并发:在同一时刻,有多个指令在单个CPU上交替执行.
并行:在同一时刻,有多个指令在多个CPU上同时执行.
进程:正在运行的软件.
线程:进程中的单个顺序控制流,是一条执行路径.
public class MyThread extends Thread {
@Override
public void run() {
// run方法是执行的内容
for (int i = 0; i < 100; i++) {
System.out.println("线程开启了"+i);
}
}
}
public class MyThreadTest {
public static void main(String[] args) {
MyThread t1 = new MyThread();
MyThread t2 = new MyThread();
t1.start();
t2.start();
// 可以发现两个线程是交替执行的
}
}
为什么要重写run方法?
public class MyRunnable implements Runnable {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("第二种方式"+i);
}
}
}
public class MyRunnableTest {
public static void main(String[] args) {
// 创建一个参数对象
MyRunnable m1 = new MyRunnable();
MyRunnable m2 = new MyRunnable();
// 创建一个线程对象,并把参数传给这个线程
Thread t1 = new Thread(m1);
Thread t2 = new Thread(m2);
// 开启线程
t1.start();
t2.start();
}
}
public class MyCallable implements Callable<String>{
@Override
public String call() throws Exception {
for (int i = 0; i < 100; i++) {
System.out.println("线程执行中"+i);
}
return "线程执行完成";
}
}
public class MyCallableTest {
public static void main(String[] args) throws ExecutionException, InterruptedException {
MyCallable m1 = new MyCallable();
// 可以获取线程执行后的结果,也可以作为参数传递诶Thread
FutureTask<String> f1 = new FutureTask(m1);
Thread t1 = new Thread(f1);
// 开启线程
t1.start();
// 返回值
String o = f1.get();
System.out.println(o);
}
}