private void performThreads() {
		// categorize threads
		final Map<ThreadGroupReference, List<ThreadReference>> groups = new LinkedHashMap<>();
		for (ThreadReference t : vm.allThreads()) {
			ThreadGroupReference group = t.threadGroup();
			if (!groups.containsKey(group))
				groups.put(group, new LinkedList<ThreadReference>());
			groups.get(group).add(t);
		}
		// prepare listing
		threads.clear();
		int idx = 0;
		// print categories
		for (Entry<ThreadGroupReference, List<ThreadReference>> e : groups
				.entrySet()) {
			print(THREAD_GROUP, e.getKey().name());

			// print threads
			String type, name, status;
			long id;

			for (ThreadReference t : e.getValue()) {
				threads.put(idx, t);
				type = t.type().name();
				id = t.uniqueID();
				name = t.name();
				status = statusToString(t.status());
				if (t.isAtBreakpoint())
					print(THREAD_STATUS_BP, idx, type, id, name, status);
				else
					print(THREAD_STATUS, idx, type, id, name, status);
				idx++;
			}
		}
	}