JavaでThreadを使って感じたこと

この記事は2017年06月29日に公開されました。 情報が古い可能性があります。

こんにちは、殿内(@tonoccho)です

学校でJavaの授業を受けています。プログラミングのバックグラウンドがない人から自分のようにある程度の実務経験がある人まで様々でした。
初心者を交えつつも授業の内容はマルチスレッドとソケット通信。今時のプログラミングの世界では相当隠蔽されている部分なので、ここをあえてやる理由はあまりないような気もするのだけど、改めてやってみると結構忘れている部分が多いことに気づく。
あと、問題があまり初心者向けになっていくと「えっそうなの!?」と思わされる問題に出くわすこともあります。

スレッドについて

Javaは誕生当時からマルチスレッドがサポートされた言語、というのが売りだったような気がする。Threadクラスのインスタンスを作ってstartメソッドを呼べばスレッドが開始される。Runnableを実装してそれをThreadに放り込んでも良い。
synchronizedキーワードでロックをするという仕組みもあるし、何気に今のJavaでも便利にスレッドを使えるようにするクラスが足されている。
ただ、先に書いたように、例えばJ2EEの世界ではThreadクラスを使うことはご法度だったし、その辺の管理は割とフレームワークが吸収しているからあえて自分でマニュアルにスレッドを立ち上げる、ということはしなくなった気がする。というより、マルチスレッドプログラミングは、独習Javaの例題で触れただけだったので、threadに関しての実務経験はないような気もする。
以前いた案件では、外部からコマンドを受け付けるスレッドをJ2EEサーバーで立ち上げていたことがあったけど、それも本来はEJBとかにやらせることだったような気がする。好みでいうならMessage Driven Bean (当時のJ2EEバージョンにはまだそういうのなかったけど)。

そもそも難しい

頭からお尻まで一直線に動いて終わるプログラムと違って、マルチスレッドは複数の処理が並行して走るので、どこで同期を取るか、とか、エラーの時はどうするか、とか、そもそもスレッド立ち上げすぎるとコンテキストスイッチだけでCPU持ってかれちゃうとかそういったのもあって、マルチスレッドプログラミングは自分ではあまり作らない、というふうになっていた。なので、自分にとってマルチスレッドプログラミングは、ある意味鬼門の分野ではある。
 

知っておいた方がいいことではある

ただ、Cのポインターの考え方然りで、マルチスレッドも知識として持っておいた方がいいことではある。
この辺がなぜ大事かというと、ポインターの考えを知っていれば、なぜこのプログラムは他の部分に副作用を与えているのか、とか、マルチスレッドの考えを知っていれば、なぜこのアクセスカウンターは数字が飛ぶのか、とかそういったことも理解できるし、もうちょっと勉強すれば直せるようになるだろうし。
あとは、今流行りの機械学習とかするのであれば、処理の粒度をどうするかとか、何と何が並行で動いていいのかとか、そういうことを考える手助けになるかもしれないし、今回のようなプログラムを書く時も設計するときの手助けにはなる。

Javaはやはり初心者向けの言語ではない

授業の中でJavaを使ったんだけど、改めてこれは初心者向けじゃないなと思った。やはりクラス、という考え方はどこか混乱しやすい。例えば、HelloWorldクラスにHelloWorldコンストラクタがあってhelloWorldメソッドがあればこうなる。

class HelloWorld{
public HelloWorld(){}
public void helloWorld(){}
}

で、使い方はこうなる。

HelloWorld helloWorld = new HelloWorld();
helloworld.helloWorld();

これはクラスという考え方が初心者には難しいのでは、という以前に、同音異義語が乱立するからだと思う。上のサンプルに一体何回[h|H]elloWorld書いたでしょう、という話だ。
なので、今自分がやっていることがインスタンスを作ってるのか、メソッドを呼んでいるのか、自分が書いたのはメソッドかクラスか、明らかに混乱していた。ここまで混乱してしまうとさすがに軌道修正も難しい。LL言語だったらなんだろうこんな感じか?

function helloWorld = new function(){}

こうやって定義して

helloWorld();

こうやって呼ぶのかな(こんな言語あるかとか言わないで欲しいけど)。
なので、サンプルコードを書く時も結構神経使わないと、「アレのアレをアレして」になってしまうのだろう。初心者がプログラミングを学ぶ上でじゃぁどんな言語がいいのか、と言われると、論争になるのであまり考えたくはないのだけど、少なくともJavaは外してもいいような気がする。

それでもJavaをやる理由

初心者向けじゃないJavaだけど、なんだかんだマーケットでは今も支配的な地位を保っているので、学校として無視できる存在ではない、というジレンマもあるような気がする。なので、プログラミングも教育するのであれば、ある程度の体系は必要かもしれない。
ただ、Javaにはプログラミングができる人がより便利にプログラムを書く言語、という色合いが強いような気がするので、プログラミングそのものを学ぶというものではないような気がする。
 

ニュージーランドの最新記事

移住の最新記事

勉強の最新記事