提升性能是我们在编程的时候常常听到的一句话。在一般情况下我们通过优化算法,减少时间复杂度提升性能,但是算法总是会有一个极限。这时候我们如果想接着优化我们的程序我们就需要将目光从软件移到硬件上去了,我们现在使用的CPU都有多个核心,为了充分利用多核和多处理器,我们需要将程序转化为并行执行。
在这里我们首先区分一下进程和线程的区别,很多初学者都很容易搞混他们两个
进程:私有空间,彼此隔离,拥有整台计算机的资源,多进程之间不共享内存。一般来说,进程==程序==应用,但一个应用中可能包含多个进程。
线程:进程=虚拟机;线程=虚拟CPU,程序内部的控制机制,程序共享、资源共享,都隶属于进程
根据这个描述我们可以看出,我们想要实现的是在我们的程序(也就是一个进程)中实现多个线程的并行执行以提高效率,在搞懂这一点之后我们就可以开始尝试编写一个多线程的程序了。
首先每一个进程都必须有一个主线程在主线程中我们可以创建其他线程,创建一个线程有两种方式实现Runnable接口或者继承Thread类:
package P1;
public class yanshi extends Thread{
@Override
public void run() {
System.out.println("you start a thread");
super.run();
}
public String getMessage(){
return new String("i'm a thread");
}
}
我们看到,当一个类继承了Thread之后除了必须重写run函数之外,也可以像其他类一样拥有其他的方法和属性。
package P1;
public class MagicSquare {
public static void main(String[] args){
yanshi aa=new yanshi();
aa.start();
//(new yanshi()).start();
}
}
这是启动线程的两种方式一种是给创建的实例一个别名然后.start()另一种是直接创建一个实例.strat()。在.strat()之后线程会自动执行run函数中的代码 。
用Runnable接口:
package P1;
public class yanshi implements Runnable{
@Override
public void run() {
System.out.println("you start a thread");
}
public String getMessage(){
return new String("i'm a thread");
}
}
在这里yanshi类实现了Runnable接口,重写了里面唯一的一个run方法
package P1;
public class MagicSquare {
public static void main(String[] args){
yanshi aa=new yanshi();
new Thread(aa).start();
}
}
由于yanshi实现的是Runnable接口所以它无法像一个线程一样直接.start()(也可以说是因为他没有这个方法),所以我们要开始这个线程的时候要把他放在一个Thread实例中.strat()
其实我们还有一种开启线程的方式,在上面两种方式中我们都是用自己的类继承Thread或者实现Runnable,在这一种中我们直接开启线程而不用写一个类去继承或实现他们:
package P1;
public class MagicSquare {
public static void main(String[] args){
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("you start a thread");
}
}).start();
}
}
直接在thread里面实现Runnable的run方法十分的简单粗暴,但是这样会让我们的代码结构混乱并且可读性降低,所以尽量还是减少使用这种方法吧。