1.スレッドとプロセス
1.1プロセス
プロセスは、私たちがTIM.exeがプロセスで実行し、オペレーティングシステムの概念です。
プロセス(プロセス)は、システムの活動に関するデータの集合で実行するコンピュータプログラムは、リソース割り当ておよびスケジューリングの基本単位である基礎となるオペレーティング・システム・アーキテクチャです。設計プロセスの初期段階のためのコンピュータ・アーキテクチャでは、基本的なプロセスは、プログラムの実体の実行で、スレッドのための現代のコンピュータアーキテクチャの設計では、スレッドが処理容器です。プログラム命令、データの編成であり、プロセスのその説明は、固体のプログラムです
1.2スレッド
スレッドは、プロセスに取り付けられ、各スレッドは、親プロセスを持たなければならない、存在する、
スレッドは、独自のスタック、プログラムカウンタを有し、ローカル変数、システムリソース、スレッドと他のスレッドは、プロセスを共有し、
プロセスがメモリを共有することができず、スレッド間であることができます簡単に共有メモリ
2.マルチスレッドの意義
最大のパフォーマンスのためにマルチコアプロセッサの2.1
シングルスレッドのタスクを実行するためのクアッドコアプロセッサとして、コアは、唯一のスレッドを実行することができ、次いで、3つのコアのパフォーマンスが無駄になります。別の例では、シングルスレッドのタスクを実行して32コアCPUのサーバであり、サーバのパフォーマンスの「怠惰」、主に廃棄物に31コアと、
このようなブロガーコンピュータCPUとしてはI7 6700HQ、クアッドコア8スレッドです。CPUは使用しています超线程技术
。単に環境をシミュレートするため、シングルコアプロセッサ、デュアルコアを置くが、コアは常に1つのエンティティのみであるため、プロセッサのアップグレードのパフォーマンスを倍増することができません約20パーセントのパフォーマンスながら、 30成長します。
私たちは、8コアプロセッサの去勢バージョンとして理解することができ、8コアを購入する余裕がない、8つのスレッドプロセッサはまた、それを買う余裕はありませんか?
2.2最大性能のためのシングルコアプロセッサを再生
プロセスはシングルスレッドである場合、それはI / O操作のために待機しているが完了すると、プロセッサはアイドル状態であり、プロセスはマルチスレッドである場合、スレッドがいくつかの時間I / O操作が完了し、別のスレッドを待っていますこれを実行することができます。
シングルコアプロセッサの場合は、複数のスレッドを実行します
1.单核CPU同一时间,CPU只能处理1个线程,只有1个线程在执行
2.多线程同时执行:是CPU快速的在多个线程之间的切换
3.CPU调度线程的时间足够快,使我们产生错觉,多线程“同时”执行
4.如果线程数非常多,CPU会在n个线程之间切换,消耗大量的CPU资源,每个线程被调度的次数会降低,线程的执行效率降低
3.创建线程
3.1 继承Thread
继承Thread,重写run方法。
public class MyThread00 extends Thread{
public void run()
{
for (int i = 0; i < 50; i++)
{
System.out.println(Thread.currentThread().getName() + "在运行!");
}
}
public static void main(String[] args)
{
MyThread00 mt0 = new MyThread00();
//启动线程
mt0.start();
//main线程
for (int i = 0; i < 50; i++)
{
System.out.println(Thread.currentThread().getName() + "在运行!");
}
}
}
start方法:
调用start方法Java虚拟机会启动run方法;
一个线程不能多次调用start方法;
死去的线程不能被重启;
执行结果如下:
main在运行!
main在运行!
main在运行!
main在运行!
main在运行!
main在运行!
main在运行!
main在运行!
main在运行!
main在运行!
main在运行!
main在运行!
main在运行!
main在运行!
main在运行!
main在运行!
main在运行!
main在运行!
main在运行!
Thread-0在运行!
Thread-0在运行!
Thread-0在运行!
Thread-0在运行!
Thread-0在运行!
Thread-0在运行!
Thread-0在运行!
Thread-0在运行!
......
线程交替执行,不会按照固定顺序执行,每次执行的结果都不一致。
3.2 实现Runnable
实现Runnable接口,重写run方法;有利于代码解耦。
public class MyThread01 implements Runnable
{
public void run()
{
for (int i = 0; i < 50; i++)
{
System.out.println(Thread.currentThread().getName() + "在运行!");
}
}
public static void main(String[] args)
{
MyThread01 mt0 = new MyThread01();
Thread t = new Thread(mt0);
//启动线程
t.start();
//main线程
for (int i = 0; i < 50; i++)
{
System.out.println(Thread.currentThread().getName() + "在运行!");
}
}
}
执行结果类似于3.1
3.3 实现Callable
实现Callable创建线程,重写call方法,该方法可以返回值和抛出异常
public class MyThread03 implements Callable<Integer> {
@Override
public Integer call() throws Exception {
System.out.println("计算处理中...");
Thread.sleep(3000);
return 1;
}
public static void main(String[] args) {
//构建任务
MyThread03 t = new MyThread03();
//执行Callable方式,需要FutureTask实现类的支持,用于接收运算结果
FutureTask<Integer> task = new FutureTask<Integer>(t);
//启动线程
new Thread(task).start();
//获取结果
try {
Integer integer = task.get(5000,TimeUnit.MILLISECONDS);
System.out.println("线程执行结果:"+integer);
} catch (Exception e) {
e.printStackTrace();
}
}
}
执行结果如下
计算处理中...
线程执行结果:1
我们获取到了call方法的返回值,继承Thread和实现Runnable方式创建线程无法获得返回值