---
title: "Tom loop drar cpu-kraft"
type: "forum-thread"
url: "https://www.webforum.nu/amne/java/124214-tom-loop-drar-cpu-kraft"
topic: "Java"
topic_url: "https://www.webforum.nu/amne/java"
author: "Gein"
published: "2005-03-11T22:52:41.000Z"
updated: "2005-03-13T11:51:47.000Z"
replies: 7
views: 396
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/java/124214-tom-loop-drar-cpu-kraft"
---

# Tom loop drar cpu-kraft

## #1 — Gein, 2005-03-11T22:52Z

Jag har en tom loop som rullar så länge ett villkor är uppfyllt. Detta för att se till att tråden inte dör förrän det är OK. Att ha en tom loop innebär att programmet i princip hela tiden kollar om villkoret är sant och detta drar all tillgänglig CPU-kraft. För att lösa detta har jag lagt in en sleep på ett par sekunder i loopen.
Finns det ett bättre och snyggare sätt att lösa det på, där man samtidigt har direkt synkronisering? Med min lösning så kan programmet i värsta fall vänta dessa sekunder i onödan om villkoret förändras precis efter kontroll.

Permalänk: https://www.webforum.nu/p/124214

## #2 — jme, 2005-03-12T10:01Z

```php
public class Test implements Runnable
{
	boolean done = false;
	
	public void run()
	{
		
		try
		{
			while(!done)
			{
				// gör vad du ska
				Thread.sleep(200);
			}
		}
		catch(InterruptedException ie)
		{
			
		}
	}
}
```

Om du vill stoppa körningen av tråden direkt, utan att tråden sover ( i detta fall, 200 ms) så kan du anropa Thread-klassens interrupt().

Permalänk: https://www.webforum.nu/p/1571642

## #3 — spango, 2005-03-13T09:43Z

Java har en massa fräcka blockingfunktioner fr.o.m. version (1.)5. [Blocking queues](http://java.sun.com/j2se/1.5.0/docs/api/index.html?java/util/concurrent/BlockingQueue.html) skulle kunna användas i ditt fall...

```

class C {

    private BlockingQueue<Object> lock = new ArrayBlockingQueue<Object>(1);

    public void run(){
        System.out.print("Börjar tråden...");
        lock.take();
        System.out.println(" avslutar.");
    }

    public void stopRunning(){ lock.add(new Object()); }

}
```

När run() börjar är kön tom, så take() väntar tills något hamnar i kön, vilket händer vid anrop av stopRunning(). Detta innebär förstås att tråden själv inte kan avgöra exakt när väntandet ska avbrytas, vill du decoupla det från vad det nu är som bevakas får du göra någon lyssnarvariant.

Mer om trådningshjälpmedel finns på  <http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/package-summary.html>

Permalänk: https://www.webforum.nu/p/1571972

## #4 — Gein, 2005-03-13T10:00Z

BlockingQueue verkar bekvämt men jag kan tyvärr inte gå över till 1.5 i detta fall.

```
public class ThreadStream implements Runnable {
	public Thread activity = new Thread(this);

	private VideoServer vs;
	private String cAddress;
	private String cPort;
	private String mediaLocator;

	public ThreadStream(VideoServer vs, String mediaLocator,
			String cAddress, String cPort) {
		this.vs = vs;
		this.mediaLocator = mediaLocator;
		this.cAddress = cAddress;
		this.cPort = cPort;
	}

	public void run() {

		VideoTransmit VT = new VideoTransmit(mediaLocator, cAddress, cPort);
		vs.setVT(VT);
		
		// Start the transmission
		System.out.println("Stream starting from " + mediaLocator + " to "
				+ cAddress + ":" + cPort);
		String result = VT.start();

		// result will be non-null if there was an error. The return
		// value is a String describing the possible error. Print it.
		if (result != null) {
			System.err.println("Error : " + result);
			System.exit(0);
		}
		while (vs.getStream()) {
			try {Thread.sleep(500);} catch (Exception e) {} // Continue streaming
		}

		// Stop the transmission
		VT.stop();
		vs.setVT(null);
		System.out.println("Transmission ended.");
	}
}
```

Så här ser trådklassen ut.
Så här skapar jag en tråd

```
ThreadStream t = new ThreadStream(vs, vidSource, arrInput[0], cPort);
vs.setStreaming(true);
t.activity.start();
```

Om jag försöker köra t.interrupt() så klagar den: "cannot resolve symbol method interrupt ()

Permalänk: https://www.webforum.nu/p/1571975

## #5 — spango, 2005-03-13T10:11Z

interrupt() ligger i Thread, så du får köra t.activity.interrupt(). Sen använder du Thread.sleep() i stället för Thread.sleep(int).

Permalänk: https://www.webforum.nu/p/1571978

## #6 — Gein, 2005-03-13T11:02Z

Det finns ingen Thread.sleep() (utan parameter)?

Permalänk: https://www.webforum.nu/p/1571988

## #7 — spango, 2005-03-13T11:43Z

Just ja, det var wait() jag tänkte på. Jaja, ta nåt godtyckligt tal.

Permalänk: https://www.webforum.nu/p/1572015

## #8 — Gein, 2005-03-13T11:51Z

Tack för hjälpen!

Permalänk: https://www.webforum.nu/p/1572018

---

Tråden på webben: https://www.webforum.nu/amne/java/124214-tom-loop-drar-cpu-kraft
