Threads: 4 Threads, 4mal Zugriff auf Array soll nicht der gleiche Zugriff sein

Netzgeist

Mitglied
Guten Morgen,
folgendes Problem hindert mich am weiterkommen.

Main.java:
Java:
public class Main {

    public static void main(String[] args) {
        Bot t1, t2, t3, t4;
        t1 = new Bot();
        t2 = new Bot();
        t3 = new Bot();
        t4 = new Bot();

        t1.start();
        t2.start();
        t3.start();
        t4.start();

    }
}
Hier erstelle ich 4 Threads die Parrallel laufen sollen. Tun sie auch, dummerweise tun sie alle das gleiche, was dann durch höheren speicherverbrauch die Sache nicht schneller sondern langsamer macht.

Bot.java
Java:
public class Bot extends Thread {

    @Override
    public void run() {   
        
        ......

        ProxyUsage pu1 = new ProxyUsage();
        pu1.setProxylist("E:/Proxylists/23.06.2010.txt");

        for (int i = 10; i < pu1.countProxies; i++) {

            try {

                String currentProxy = pu1.getCurrentProxy();

                Testobjekt t1 = new Testobjekt();
                t1.setcHostname(profildetails[0]);
                t1.setcProxy(currentProxy);

                String[] reply = t1.teste();
                t1.setsInput(reply[0]);
                t1.setsServerantwort(reply[1]);
                t1.setsGoodkey(profildetails[1]);
                t1.setsBadkey(profildetails[2]);
                String testantwort = t1.searchGoodOrBad();

                if (testantwort.equals("Suchstring")) {
                    System.out.println("Suchstring gefunden: (" + currentProxy + ")");

                } else {
                    System.out.println("Suchstring nicht gefunden: (" + currentProxy + ")");
                    pu1.setNextProxy();
                }

            } catch (Exception exAll) {
                System.out.println("Fehler:" + exAll);
                System.out.println("Proxy: " + pu1.getCurrentProxy());
                pu1.setNextProxy();
                            
            }
            ......
        }   
    }
Das hier ist die Klasse die der Thread aufruft. Innerhalb des Aufrufes werden Objekte anderer Klassen im selben Paket erzeugt und es wird mit ihnen gearbeitet.

ProxyUsage.java:
Java:
public class ProxyUsage {

    private String[] proxylist;   
    private int proxycounter = 0;

    public void setProxylist(String filename) {

        try {
            FileReader fileReader = new FileReader(filename);
            BufferedReader bufferedReader = new BufferedReader(fileReader);
            List<String> lines = new ArrayList<String>();
            String line = null;
            while ((line = bufferedReader.readLine()) != null) {
                lines.add(line);
            }
            bufferedReader.close();
            String[] a1 = lines.toArray(new String[lines.size()]);
            proxylist = a1;
        } catch (IOException ex) {
            System.out.println("Datei nicht gefunden!");
        }
    }

    public int getProxycounter() {
        return proxycounter;
    }

    public synchronized String getCurrentProxy() {
        return proxylist[getProxycounter()];
    }

    public void setNextProxy() {
        ++proxycounter;
    }

}
Hier noch der Vollständigkeit halber die Klasse die das eigendliche Objekt erzeugt das die Proxies beinhaltet.

Der Aufruf von Main.java sieht in etwa so aus:
Fehler:java.net.ConnectException: Connection refused: connect
Proxy: 212.117.166.26:8138
Fehler:java.net.ConnectException: Connection refused: connect
Proxy: 212.117.166.26:8138
Fehler:java.net.ConnectException: Connection refused: connect
Proxy: 212.117.166.26:8138
Fehler:java.net.ConnectException: Connection refused: connect
Proxy: 212.117.166.26:8138

In erster Linie interessiert mich natürlich wie ichs möglich machen kann das die 4 Threads nicht dasselbe tun. Dazu wäre noch gut zu wissen ob die Threads jeweils für sich ein Objekt der Klasse ProxyUsage erzeugen, oder ob das einmal erzeugt wird und alle dann darauf zugreifen.
Vielen Dank für jede Hilfe 😉
 
jeder thread öffnet für sich die gleiche datei und abarbeitet den inhalt.

mein vorschlag wäre eine eigene klasse für diese datei zu schreiben die einmal den inhalt liest und von den threads aus über eine objektreferenz angesprochen wird (synchronized getNextElement...).

bin allerdings noch relativ noob was java angeht und lasse mich gerne verbessern wenn der vorschlag abstrus ist 🙂
 
In erster Linie interessiert mich natürlich wie ichs möglich machen kann das die 4 Threads nicht dasselbe tun.
Das liegt doch in Deiner Hand was die Threads tun ;-)
Dazu wäre noch gut zu wissen ob die Threads jeweils für sich ein Objekt der Klasse ProxyUsage erzeugen, oder ob das einmal erzeugt wird und alle dann darauf zugreifen.
Steht ja im Code: in der run() wird jedes mal ein neues Objekt vom Typ ProxyUsage erzeugt.
--> Wie alderwaran bemerkt hat liest jeder Thread die Datei nochmals aus.
Das Auslesen der Datei und erstellen einer Liste ist ja - so habe ich es zumindest Verstanden - nicht Aufgabe der Threads. (So Neben bei: Warum machst Du aus einer ArrayList ein Array?)
Also: Erst Datei auslesen und die Liste erzeugen, diese Liste dann den Threads zur Verfügung stellen und anschliessend die Threads starten.
Eine Klasse die in diesem Zusammenhang für Dich interessant sein könnte: ConcurrentLinkedQueue
 
Hör auf Michael... und schreibe keine eigenen Threads, sondern benutze den ExecutorService, auch aus dem Package java.util.concurrent.
 
@alderwaran: sowas wollte ich ja machen und hab deshalb in class ProxyUsage ausgelagert. Hab da irgendwie aber nicht zuende gedacht, ich müsste das Proxylisten Objekt mal vor den threads erzeugen, sodass alle thread zum objekt hin requesten.

@FArt: Wird gelesen und getestet. Danke 🙂


Edit: Lösungsweg:
Ich erstell das Objekt proxyliste vor den threads, bau in die threads nen kontruktor ein der einen verweiss auf proxyliste innerhalb des Threads erzeugt und damit proxyliste ansprechbar macht. die methoden für den Proxytausch etc. dann synchronized laufen lassen und gut is. :rtfm:
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben