<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="et">
	<id>http://www.lambda.ee/w/index.php?action=history&amp;feed=atom&amp;title=Java_n%C3%A4ide_loengust</id>
	<title>Java näide loengust - Redigeerimiste ajalugu</title>
	<link rel="self" type="application/atom+xml" href="http://www.lambda.ee/w/index.php?action=history&amp;feed=atom&amp;title=Java_n%C3%A4ide_loengust"/>
	<link rel="alternate" type="text/html" href="http://www.lambda.ee/w/index.php?title=Java_n%C3%A4ide_loengust&amp;action=history"/>
	<updated>2026-10-28T16:14:44Z</updated>
	<subtitle>Selle lehekülje redigeerimiste ajalugu</subtitle>
	<generator>MediaWiki 1.43.11</generator>
	<entry>
		<id>http://www.lambda.ee/w/index.php?title=Java_n%C3%A4ide_loengust&amp;diff=13286&amp;oldid=prev</id>
		<title>PriitJ: Uus lehekülg: &#039;&lt;code&gt;java.util.concurrent&lt;/code&gt; annab erinevad juba paralleelseks kasutuseks sobivad klassid: &lt;pre&gt; import java.io.*; import java.util.concurrent.*; &lt;/pre&gt; See klass esindab th...&#039;</title>
		<link rel="alternate" type="text/html" href="http://www.lambda.ee/w/index.php?title=Java_n%C3%A4ide_loengust&amp;diff=13286&amp;oldid=prev"/>
		<updated>2016-09-29T15:01:12Z</updated>

		<summary type="html">&lt;p&gt;Uus lehekülg: &amp;#039;&amp;lt;code&amp;gt;java.util.concurrent&amp;lt;/code&amp;gt; annab erinevad juba paralleelseks kasutuseks sobivad klassid: &amp;lt;pre&amp;gt; import java.io.*; import java.util.concurrent.*; &amp;lt;/pre&amp;gt; See klass esindab th...&amp;#039;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Uus lehekülg&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;code&amp;gt;java.util.concurrent&amp;lt;/code&amp;gt; annab erinevad juba paralleelseks kasutuseks sobivad klassid:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import java.io.*;&lt;br /&gt;
import java.util.concurrent.*;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
See klass esindab threadide poolt jagatud ressurssi (keyword &amp;lt;code&amp;gt;synchronized&amp;lt;/code&amp;gt; on selgitatud workeri juures).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class SharedState {&lt;br /&gt;
	int a;&lt;br /&gt;
	int b;&lt;br /&gt;
	synchronized void transact(int amount) {&lt;br /&gt;
		a = a - 10;&lt;br /&gt;
		b = b + 10;&lt;br /&gt;
	}&lt;br /&gt;
	LinkedBlockingQueue&amp;lt;String&amp;gt; q;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Klass &amp;lt;code&amp;gt;Worker&amp;lt;/code&amp;gt; teeb 10 ühiku suuruseid transaktsioone muutujate a ja b vahel. Kui selliseid workereid on mitu, tekib oht, et andmed korrumpeeruvad samaaegse lugemise/kirjutamise tõttu. Seepärast on ühise ressursi kasutamine pandud &amp;lt;code&amp;gt;synchronized&amp;lt;/code&amp;gt; bloki sisse. Korraga saab sellises blokis (&amp;#039;&amp;#039;critical section&amp;#039;&amp;#039;) olla vaid üks thread. Sama käib ka &amp;lt;code&amp;gt;synchronized&amp;lt;/code&amp;gt; meetodite kohta.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Worker extends Thread {&lt;br /&gt;
	SharedState ss;&lt;br /&gt;
	Worker(SharedState ss) {&lt;br /&gt;
		this.ss = ss;&lt;br /&gt;
	}&lt;br /&gt;
	public void run() {&lt;br /&gt;
		System.out.println(&amp;quot;started &amp;quot;+getId());&lt;br /&gt;
		for(int i=0; i&amp;lt;5000; i++) {&lt;br /&gt;
			//ss.transact(10);&lt;br /&gt;
			synchronized(ss) {&lt;br /&gt;
				ss.a = ss.a - 10;&lt;br /&gt;
				ss.b = ss.b + 10;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		System.out.println(&amp;quot;finished &amp;quot;+getId());&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Klass &amp;lt;code&amp;gt;Producer&amp;lt;/code&amp;gt; paneb järjekorda elemente juurde. See asub ka jagatud mäluosas, aga seda &amp;#039;&amp;#039;&amp;#039;ei tohi&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;synchronized&amp;lt;/code&amp;gt; bloki sisse panna, kuna antud queue implementatsioon juba sisaldab lukustamist. Igasugune lukkude taga ootamine, ise teist lukku kinni hoides on potentsiaalne koht &amp;#039;&amp;#039;deadlocki&amp;#039;&amp;#039; tekkimiseks. &amp;lt;code&amp;gt;Consumer&amp;lt;/code&amp;gt; kasutab blokkivat meetodit &amp;lt;code&amp;gt;.take()&amp;lt;/code&amp;gt;, mis ei returni seni, kuni järjekorda andmed tekivad.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Producer extends Worker {&lt;br /&gt;
	Producer (SharedState ss) {&lt;br /&gt;
		super(ss);&lt;br /&gt;
	}&lt;br /&gt;
	public void run() {&lt;br /&gt;
		System.out.println(&amp;quot;started &amp;quot;+getId());&lt;br /&gt;
		for(int i = 0; i&amp;lt;10; i++) {&lt;br /&gt;
			try {&lt;br /&gt;
				ss.q.put(&amp;quot;tere&amp;quot;);&lt;br /&gt;
			} catch(InterruptedException e) {&lt;br /&gt;
				//		&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		System.out.println(&amp;quot;finished &amp;quot;+getId());&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
class Consumer extends Worker {&lt;br /&gt;
	Consumer (SharedState ss) {&lt;br /&gt;
		super(ss);&lt;br /&gt;
	}&lt;br /&gt;
	public void run() {&lt;br /&gt;
		System.out.println(&amp;quot;started &amp;quot;+getId());&lt;br /&gt;
		for(int i = 0; i&amp;lt;10; i++) {&lt;br /&gt;
			try {&lt;br /&gt;
				String dummy;&lt;br /&gt;
				dummy = ss.q.take();&lt;br /&gt;
				System.out.println(&amp;quot;Received &amp;quot;+dummy);&lt;br /&gt;
			} catch(InterruptedException e) {&lt;br /&gt;
				//		&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		System.out.println(&amp;quot;finished &amp;quot;+getId());&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Threadide tegemine paralleelsete transaktsioonide (välja kommenteeritud) või producer-consumer mudeli testimiseks.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class ParaTest {&lt;br /&gt;
	public static void main(String [] argv) {&lt;br /&gt;
		Worker t1, t2;&lt;br /&gt;
		Producer p;&lt;br /&gt;
		Consumer c;&lt;br /&gt;
		SharedState ss = new SharedState();&lt;br /&gt;
		ss.a = 100000;&lt;br /&gt;
		ss.b = 0;&lt;br /&gt;
		ss.q = new LinkedBlockingQueue&amp;lt;String&amp;gt; ();&lt;br /&gt;
		&lt;br /&gt;
		p = new Producer(ss);&lt;br /&gt;
		c = new Consumer(ss);&lt;br /&gt;
//		t1 = new Worker(ss);&lt;br /&gt;
//		t2 = new Worker(ss);&lt;br /&gt;
		c.start();&lt;br /&gt;
		p.start();&lt;br /&gt;
//		t1.start();&lt;br /&gt;
//		t2.start();&lt;br /&gt;
		try {&lt;br /&gt;
			p.join();&lt;br /&gt;
			c.join();&lt;br /&gt;
//			t1.join();&lt;br /&gt;
//			t2.join();&lt;br /&gt;
		} catch(InterruptedException e) {&lt;br /&gt;
			//		&lt;br /&gt;
		}&lt;br /&gt;
//		System.out.println(&amp;quot;a: &amp;quot;+ss.a+&amp;quot; b: &amp;quot;+ss.b);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>PriitJ</name></author>
	</entry>
</feed>