(1)マルチスレッド:アプリケーションの複数の実行パスであります
プロセス:アプリケーションが実行されます。このプログラムは、システムリソースの割り当てと呼ばれる独立したユニットが実行されています。各プロセスは、独自のメモリ空間とシステムリソースを持っています。
スレッド:プロセスのパスを実行する実行手段(コントロールの単一逐次プロセスフローで実行パスです)
シングルスレッド:アプリケーションは、唯一の実行パスを持っています
マルチスレッド:アプリケーションがされている複数の実行パスを
マルチプロセスを意味?
CPUの使用率を向上させます
複数のスレッドを意味?
アプリケーションの使用が増加
並列並行:
論理的には、同時に特定の時間内に同時に複数のプログラムを実行するための手段平行です。
並行処理は、同時に物理的にある時点で同時に実行する複数のプログラムを意味しています。
原則(2)Javaプログラムを動作させると開始JVMはマルチスレッドdoがありますか?
A:スタートjavaコマンドJVMによって、JVMは、プロセスを開始するのと同等を開始します。その後、プロセスはmainメソッドを呼び出すようにメインスレッドを作成しています。
B:JVMの起動には、ガベージコレクションのスレッドはまた、最初に起動するので、それは簡単にメモリ不足に表示され、マルチスレッドです。メインスレッドの前で一緒に今、ガベージコレクションスレッド、
最低2つのスレッドを開始するので、実際にはJVMの起動時には、マルチスレッドこと。
(3)マルチスレッド実装(マスタ)
A:Threadクラスの継承
1.ステップ:
:MyThreadカスタムクラスは、Threadクラスを継承します。
B:オーバーライドは実行MyThreadクラス()
run()メソッドが行うのはなぜ?
すべてのコードが実行スレッドするクラスが必要ではありません。そして、この時間は、コードの実行のどのスレッドを区別することができるようにするために、JavaはThreadクラスを提供します
実行コードのスレッドを含むものに()を実行し
C:オブジェクトを作成MyThread MY1 =新しいMyThread();
D:スレッドmy1.startを開始()。
注意:
1. 実行の間の差()とstart()がありますか?
()を実行します。コードのパッケージは、単に実行スレッドです、ダイレクトコールは一般的な方法であり、
スタート():最初にスレッドを起動し、()メソッドこのスレッドを実行するためにJVMを呼び出します。
2.my1.start(); my1.start();ないIllegalThreadStateException:不正なスレッド異常状態
これは私のスレッドの同等が2回呼び出されているので。代わりに、2つのスレッド・着工。
2.メソッドの名前を取得/スレッドを設定します。
公共の最終文字列のgetName():スレッドの名前を取得します。
公共の最終無効のsetName(文字列名):スレッドの名前を設定します。
パブリック静的スレッドcurrentThreadは():現在実行中のスレッドオブジェクトを返します。
Thread.currentThread()。のgetName()
B:Runnableを実装します
ステップ:
A:カスタムクラスはRunnableを実装しMyRunnable
B:オーバーライドrun()メソッド
C:オブジェクトのクラスを作成しますMyRunnable
D:Threadクラスのオブジェクトを作成し、構成パラメータ転送ステップとしてオブジェクトC
(4)スレッドスケジューリングおよび優先課題
A:スレッドのスケジューリング
A:時分割スケジューリング
B:プリエンプティブスケジューリング(Javaがスケジューリングモードで使用されています)
B:スレッドの優先度を取得および設定
公共の最終int型getPriority():スレッドオブジェクトの優先順位を返します。
公共の最終無効setPriorityを(int型newPriority):スレッドの優先順位を変更します。
スレッドのデフォルトの優先度は5です。
スレッドの優先順位の範囲は:1-10。
高いスレッドの優先度は高い確率スレッドがより良い結果を確認するために、複数回の実行回数、またはときに、より多くのCPUタイムスライスを取得しますが、示しています。
IllegalArgumentException:不正な引数例外。この方法に違法または不正なパラメータを渡すことを示すためにスローされます。
コントロール(5)スレッド(一般的方法)
:寝スレッド
公共の静的な無効スリープ(ロングミリ秒)
B:スレッドを追加します
公共の最後のボイド(参加):このスレッドを待ち。
C:礼譲スレッド
パブリック静的ボイド収率():現在実行中のスレッドオブジェクトを一時停止し、他のスレッドを実行します。より調和のとれたの複数のスレッドを実行させるが、一人一回ことを確実にするために信頼することはできません。
D:バックグラウンドスレッド
公共の最終のボイドは、setdaemon(上のブール値):このスレッドがデーモンスレッドまたはユーザスレッドとしてマークされています。
スレッドを実行すると、デーモンスレッド、Java仮想マシンを終了する場合。このメソッドは、スレッドを開始する前に呼び出さなければなりません。
E:スレッドを終了(マスター)
公共の最終無効停止():ストップ、日付のうちに糸が、また、使用することができます。
ます。public void割り込み():割り込みスレッド。スレッドの状態が終了し、InterruptedExceptionあるをスローします。
(6)スレッドのライフサイクル
A:新しいです
B:レディ
C:実行
D:ブロックされました
E:死
スレッドの状態遷移図、および一般的な実装。
(7)映画チケットプログラムを実施
A:Threadクラスの継承
public class SellTicket extends Thread {
// 定义100张票
// private int tickets = 100;
// 为了让多个线程对象共享这100张票,我们其实应该用静态修饰
private static int tickets = 100;
@Override
public void run() {
// 定义100张票
// 每个线程进来都会走这里,这样的话,每个线程对象相当于买的是自己的那100张票,这不合理,所以应该定义到外面
// int tickets = 100;
// 是为了模拟一直有票
while (true) {
if (tickets > 0) {
System.out.println(getName() + "正在出售第" + (tickets--) + "张票");
}
}
}
}
/*
* 某电影院目前正在上映贺岁大片(红高粱,少林寺传奇藏经阁),共有100张票,而它有3个售票窗口售票,请设计一个程序模拟该电影院售票。
* 继承Thread类来实现。
*/
public class SellTicketDemo {
public static void main(String[] args) {
// 创建三个线程对象
SellTicket st1 = new SellTicket();
SellTicket st2 = new SellTicket();
SellTicket st3 = new SellTicket();
// 给线程对象起名字
st1.setName("窗口1");
st2.setName("窗口2");
st3.setName("窗口3");
// 启动线程
st1.start();
st2.start();
st3.start();
}
}
B:Runnableを実装します
public class SellTicket implements Runnable {
// 定义100张票
private int tickets = 100;
@Override
public void run() {
while (true) {
if (tickets > 0) {
System.out.println(Thread.currentThread().getName() + "正在出售第"
+ (tickets--) + "张票");
}
}
}
}
/*
* 实现Runnable接口的方式实现
*/
public class SellTicketDemo {
public static void main(String[] args) {
// 创建资源对象
SellTicket st = new SellTicket();
// 创建三个线程对象
Thread t1 = new Thread(st, "窗口1");
Thread t2 = new Thread(st, "窗口2");
Thread t3 = new Thread(st, "窗口3");
// 启动线程
t1.start();
t2.start();
t3.start();
}
}
(8)映画発券プログラムの問題
A:良く応えるため、実際の場面では、100ミリ秒の睡眠に参加しました。
B:チケット発行
A:同じチケット数回
B:反対票
public class SellTicket implements Runnable {
// 定义100张票
private int tickets = 100;
@Override
public void run() {
while (true) {
// t1,t2,t3三个线程
// 这一次的tickets = 1;
if (tickets > 0) {
// 为了模拟更真实的场景,我们稍作休息
try {
Thread.sleep(100); //t1进来了并休息,t2进来了并休息,t3进来了并休息,
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "正在出售第"
+ (tickets--) + "张票");
//窗口1正在出售第1张票,tickets=0
//窗口2正在出售第0张票,tickets=-1
//窗口3正在出售第-1张票,tickets=-2
}
}
}
}
/*
* 实现Runnable接口的方式实现
*
* 通过加入延迟后,就产生了连个问题:
* A:相同的票卖了多次
* CPU的一次操作必须是原子性的
* B:出现了负数票
* 随机性和延迟导致的
*/
public class SellTicketDemo {
public static void main(String[] args) {
// 创建资源对象
SellTicket st = new SellTicket();
// 创建三个线程对象
Thread t1 = new Thread(st, "窗口1");
Thread t2 = new Thread(st, "窗口2");
Thread t3 = new Thread(st, "窗口3");
// 启动线程
t1.start();
t2.start();
t3.start();
}
}
(9)マルチスレッドのセキュリティ問題の理由(私たちが後で決定は、スレッドの安全性の問題に基づいてプログラムがあるかどうかです)
A:かどうかは、環境をマルチスレッド化
B:共有データがあります
C:そこに複数のオペレーティング・ステートメントのデータ共有しています
(10)は、スレッドの安全性の問題を解決する同期
実行のスレッドは、他の人が行うことができないように全体として共有データパッケージの動作にコード複数のステートメント、。
A:同期コードブロック
同期(オブジェクト){
同期コードが必要です。
}
ここでのロックオブジェクトは、任意のオブジェクトにすることができます。
問題を解決するために注意を払うために時間:複数のスレッドが同じロックでなければなりません。
B:同期方法
同期方法は、上適用されます。
ここでは、このロックオブジェクトがあります
C:静的同期方法
同期方法は、上適用されます。
ここでロックオブジェクトは、現在のクラス(リフレクション)バイトコードファイルオブジェクトがあります
利点の同期
これは、マルチスレッドのセキュリティ問題への同期ソリューションを表示されます。
医療過誤の同期
1.スレッドが非常に長い時間があるときは、裁判官への各スレッド同期ロックするので、これは非常にリソース集約型で、効果的にプログラムの効率を低下させるだろう。(非効率)
デッドロックが発生しやすい2
public class SellTicket implements Runnable {
// 定义100张票
private int tickets = 100;
// 定义同一把锁
private Object obj = new Object();
@Override
public void run() {
while (true) {
// t1,t2,t3都能走到这里
// 假设t1抢到CPU的执行权,t1就要进来
// 假设t2抢到CPU的执行权,t2就要进来,发现门是关着的,进不去。所以就等着。
// 门(开,关)
synchronized (obj) { // 发现这里的代码将来是会被锁上的,所以t1进来后,就锁了。(关)
if (tickets > 0) {
try {
Thread.sleep(100); // t1就睡眠了
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()
+ "正在出售第" + (tickets--) + "张票 ");
//窗口1正在出售第100张票
}
} //t1就出来可,然后就开门。(开)
}
}
}
public class SellTicketDemo {
public static void main(String[] args) {
// 创建资源对象
SellTicket st = new SellTicket();
// 创建三个线程对象
Thread t1 = new Thread(st, "窗口1");
Thread t2 = new Thread(st, "窗口2");
Thread t3 = new Thread(st, "窗口3");
// 启动线程
t1.start();
t2.start();
t3.start();
}
}
(11)前のスレッドセーフなクラスを想起
A:StringBufferの
B:ベクトル
C:ハッシュテーブル
D:どのようにスレッドセーフなコレクションクラスにスレッドセーフなコレクションクラスを配置します
コレクションは、ツールの方法することができます。
// 线程安全的类
StringBuffer sb = new StringBuffer();
Vector<String> v = new Vector<String>();
Hashtable<String, String> h = new Hashtable<String, String>();
// Vector是线程安全的时候才去考虑使用的,但是我还说过即使要安全,我也不用你
// 那么到底用谁呢?
// public static <T> List<T> synchronizedList(List<T> list)
List<String> list1 = new ArrayList<String>();// 线程不安全
List<String> list2 = Collections
.synchronizedList(new ArrayList<String>()); // 线程安全